关于php往oracle里存取clob的问题

zd214 2011-12-29 04:25:20
我遇到一个关于php往oracle里存取clob的问题
$clob = oci_new_descriptor($oci_handler,OCI_D_LOB);
$stmt = oci_parse($oci_handler,"INSERT INTO t_politics_test (id,content) values (1,EMPTY_LOB()) returning content into :content");
oci_define_by_name($stmt,':content',$clob,SQLT_CLOB);
oci_bind_by_name($stmt,':content',$clob,-1,SQLT_CLOB);
$content = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
oci_execute($stmt,OCI_DEFAULT);
if($clob->savefile($content)){
oci_commit($oci_handler);
}
else{
echo 'fail';
}
oci_free_descriptor($clob);
oci_free_statement($stmt);
oci_close($oci_handler);
oci_execute一直返回false,oci_error也返回false
请问如何解决
...全文
268 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zd214 2012-09-24
  • 打赏
  • 举报
回复
把empty_blob()换成你的:lob,去掉returning pos into :lob,然后用普通绑定字符串的方法insert试试
luj2006 2012-09-23
  • 打赏
  • 举报
回复
//下面的函数是封装好的。插入数据步骤:分配定位符并设置定位符为空;获取定位符(通过绑定变量);然后写入数据。
思路应该没有问题吧???
下面是实现:
char* strStmt1 = "insert into oci values(:name , :sex , empty_blob()) returning pos into :lob"; //插入一个空的BLOB数据 pos为字段名称
Prepare(strStmt1);
BindLob(SQLT_BLOB,3);
Execute(1);
//用'FOR UPDATE'语句,获取到lob定位符,CStatement类的成员(m_pLobLocator),然后写操作。
char* strStmt2 = "select pos from oci where name = :c for update";
Prepare(strStmt2);
char* buf = "f";//一个字段值
Bind(SQLT_STR,":c",buf,sizeof(buf),0);
int lob = DefineLob(SQLT_BLOB,1);
//写入LOB数据
char* str = "catmdgb";//数据内容(任意的)。
WriteLob(lob,(dvoid*)str,strlen(str)+1);
请问是什么地方有问题?
[Quote=引用 7 楼 的回复:]
引用 2 楼 的回复:

如果就用定位符绑定,怎么插入一条记录呢?

和普通插入varchar2类型一样
[/Quote]
zd214 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

如果就用定位符绑定,怎么插入一条记录呢?
[/Quote]
和普通插入varchar2类型一样
luj2006 2012-09-17
  • 打赏
  • 举报
回复
":CONTENT", lob字段内容怎么能插入进去呢?[Quote=引用 4 楼 的回复:]
$sql="INSERT INTO NEWS(TITLE,CONTENT,INHERUT,REVIEW,ADDDATE,ADDUSER,EDITDATE,START_END_TIME,VENUE,IMAGE,ORGANIZERS,SPONSOR,MEDIA,HIT)
VALUES('".$TITLE."',empty_clob(),".$ID.",".$REVIEW.",to_date('".……
[/Quote]
xuzuning 2012-09-13
  • 打赏
  • 举报
回复
用 PDO_OCI 就没有这些麻烦了
q504196481 2012-09-13
  • 打赏
  • 举报
回复
$sql="INSERT INTO NEWS(TITLE,CONTENT,INHERUT,REVIEW,ADDDATE,ADDUSER,EDITDATE,START_END_TIME,VENUE,IMAGE,ORGANIZERS,SPONSOR,MEDIA,HIT)
VALUES('".$TITLE."',empty_clob(),".$ID.",".$REVIEW.",to_date('".$ADDDATE."','yyyy-mm-dd'),'".$_COOKIE["USERNAME"]."',to_date('".$EDITDATE."','yyyy-mm-dd'),'".$START_END_TIME."','".$VENUE."','".$IMAGE."','".$ORGANIZERS."','".$SPONSOR."','".$MEDIA."',".$HIT.") returning CONTENT into :CONTENT";
//echo $sql;exit();
$stmt = OCIParse($ociconn, $sql);
$clob = OCINewDescriptor($ociconn, OCI_D_LOB);
OCIBindByName ($stmt, ":CONTENT", &$clob, -1, OCI_B_CLOB);
if(!OCIExecute($stmt,OCI_DEFAULT)) print_r(OCIError($stmt));
if($clob->save($CONTENT)){
OCICommit($ociconn);
$clob->free();
OCIFreeStatement($stmt);
echo '<script language="javascript">alert("数据添加成功");location.href="你的页"</script>';
exit();
}else{
print_r(OCIError($stmt));
$clob->free();
OCIFreeStatement($stmt);
}
luj2006 2012-09-13
  • 打赏
  • 举报
回复
如果用绑定定位符的方法插入记录,怎么插入呢?
luj2006 2012-09-13
  • 打赏
  • 举报
回复
如果就用定位符绑定,怎么插入一条记录呢?
zd214 2011-12-29
  • 打赏
  • 举报
回复
发现使用绑定变量就行了,无需使用专门的LOB

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧