免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4869 | 回复: 5
打印 上一主题 下一主题

oci 如何获取rowid [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-14 17:03 |只看该作者 |倒序浏览
查询一条语句后,想更新此语句中的field  ,于是想获取语句句柄中的rowid ,根据rowid  更新 field


我的步骤是:

step 1: 分配rowid描述符

status=OCIDescriptorAlloc ((dvoid *) m_env,
                                               (dvoid **) &rowid,
                                               (ub4) OCI_DTYPE_ROWID,
                                               (size_t) 0,
                                               (dvoid **) 0);
  cout<<"rowid allocat stat:"<<status<<endl;   //此处返回0 ,正常

step 2: 执行fetch语句之后
  
status=OCIAttrGet(m_stmt,
                    OCI_HTYPE_STMT,
                    (dvoid*) rowid,
                    (ub4 *) &rowid_len,
                    OCI_ATTR_ROWID,
                   (OCIError *) m_error);
cout<<"get rowid status:" <<status<<endl; //此处返回 100 ,用ocierroget读取出错缓冲区, 出错消息为空

step 3: rowid 转换成 char

status=OCIRowidToChar (rowid,(OraText *)rowid_str,&rowid_len, m_error );
                                                                     //程序运行到此处崩溃,Segmentation Fault(coredump)

  其他代码省略,
请教:  1. step2,step3 中 rowid 的长度rowid_len 要怎么设置呢,尝试设置一些数字都不行?
          2. 要获取rowid 是否还有其他方面要设置?

望指教!!!

论坛徽章:
7
酉鸡
日期:2013-10-30 17:17:51水瓶座
日期:2014-01-25 14:47:21天秤座
日期:2014-02-20 09:49:50处女座
日期:2014-11-04 17:44:082015年亚洲杯之中国
日期:2015-03-09 17:21:312015亚冠之北京国安
日期:2015-06-01 16:58:552015亚冠之山东鲁能
日期:2015-06-19 11:30:08
2 [报告]
发表于 2009-12-14 17:19 |只看该作者
你执行的SQL是 select * from tab for update 吗?
看帮助,如果没有for update 子句,应该不能获得rowid的。
如果没有for update 字节,就必须在返回字段列表中有 rowid 字段啊

[ 本帖最后由 syncpk99 于 2009-12-14 17:21 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-12-14 17:22 |只看该作者
原帖由 syncpk99 于 2009-12-14 17:19 发表
你执行的SQL是 select * from tab for update 吗?
看帮助,如果没有for update 子句,应该不能获得rowid的。


我看的是 oracle 官网在线文档  oci reference  没有提到一定要 for update  试下先 !!!  3qu




“我看的是 oracle 官网在线文档  oci reference  没有提到一定要 for update  试下先 !!!”  这话 我错了 !!!

我没看仔细 ,原文 :
You can use the ROWID associated with a SELECT...FOR UPDATE OF... statement in a
later UPDATE or DELETE statement. The ROWID is retrieved by calling
OCIAttrGet() on the statement handle to retrieve the handle OCI_ATTR_ROWID attribute.


SQL语句改成for update 格式,OCIAttrGet  返回 0 ,rowid_len: 为0 ,
由rowid 转换时 报如下错误
     ORA-01405: fetched column value is NULL

说明rowid  还没有取到!!!

[ 本帖最后由 llslls_007 于 2009-12-14 18:08 编辑 ]

论坛徽章:
2
操作系统版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-15 06:20:00
4 [报告]
发表于 2009-12-14 20:59 |只看该作者
for update会造成选择的行加X锁

select t.*,rowid from t_table t
就好。

论坛徽章:
0
5 [报告]
发表于 2009-12-15 14:40 |只看该作者
原帖由 草中宝 于 2009-12-14 20:59 发表
for update会造成选择的行加X锁

select t.*,rowid from t_table t
就好。


1. 实际情况是需要加锁的


2. 获取rowid时 ,rowid 长度怎么设置? 转换成字符串时,rowid 的长度怎么设置 ?
   不设置长度(长度为0) OCIAttrGet 能成功,OCIRowToChar 报错:空的列
   设置长度OCIRowToChar  崩溃


已经解决:
     两个函数的rowid 长度 理解成同样的一个长度了 ,应该分别设置长度!!!
     谢谢各位!!!

[ 本帖最后由 llslls_007 于 2009-12-15 16:19 编辑 ]

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
6 [报告]
发表于 2009-12-19 19:15 |只看该作者
原帖由 llslls_007 于 2009-12-14 17:03 发表
查询一条语句后,想更新此语句中的field  ,于是想获取语句句柄中的rowid ,根据rowid  更新 field


我的步骤是:


  其他代码省略,
请教:  1. step2,step3 中 rowid 的长度rowid_len 要怎么设置呢, ...

select a,b,c,d,ROWID from mytable .........
fetch into a,b,c,ROWID
,......
update mytable set ...... while ROWID=:ROWID
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP