技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> PHP --> php_call_oracle_procedure

php_call_oracle_procedure

浏览:1635次  出处信息

在PHP中调用oracle中的存储过程,通常就是采用PHP的OCI扩展所提供的函数来进行调用。

关于PHP调用存储过程,基本上的搜索到的国内的网页,其步骤都差不多,也只是谈到了存储过程返回一般参数,即Varchar2、number这种类型,基本上没有讲到如何返回ref cursor类型。

笔者经过测试发现,其实调用返回ref cursor类型的存储过程,其方式也与一般的调用类似,唯一不同的地方就是在采用oci_bind_by_name将采用oci_ew_cursor的创建的cursor类型的变量绑定到输出游标后,在采用oci_execute执行预处理resource后,需要采用oci_execute执行刚才所绑定的那个游标,再采用oci_fetch_*等函数获取该游标的值

各位TX可以参考以下的代码:

<?php
$conn = oci_connect('SCOTT','TIGER') or die;

$sql = 'BEGIN blog.latest(:num_entries, :blog_entries); END;';

$stmt = oci_parse($conn, $sql);

// Bind the input num_entries argument to the $max_entries PHP variable
$max_entries = 5;
oci_bind_by_name($stmt,":num_entries",$max_entries,32);

// Create a new cursor resource
$blog_entries = oci_new_cursor($conn);

// Bind the cursor resource to the Oracle argument
oci_bind_by_name($stmt,":blog_entries",$blog_entries,-1,OCI_B_CURSOR);

// Execute the statement
oci_execute($stmt);

// Execute the cursor
oci_execute($blog_entries);

print "The $max_entries most recent blog entries\n";

// Use OCIFetchinto in the same way as you would with SELECT
while ($entry = oci_fetch_assoc($blog_entries, OCI_RETURN_LOBS )) {
    print_r($entry);
}
?>

以上代码中标红色的那句代码至关重要,若返回的游标没有执行的话,将无法获取到游标的内容!

注意:在写存储过程时,若遇到同时有varchar2、number、ref_cursor等类型的做为输出时,需要将ref_cursor类型的参数放在参数列表的最后,否则将可能出现意想不到的异常!

具体原因笔者也未找到,若有TX发现,可一起讨论一下!

另外,Oracle表中的Clob类型的字段,在查询出结果后,采用var_dump出来看,会发现,那个字体是resource类型,resource类型是不能够直接显示的,需要采用stream_get_contents或者fgets等函数才能取出相应的字符串。

这个处理相对比较简单,这里就不用专门写DEMO了。

建议继续学习:

  1. 写了个Mysql的存储过程    (阅读:2226)
  2. Mysql中的存储过程    (阅读:2046)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:ECSHOP二次开发指南
后一篇:PHP伪随机发生器 >>
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1