需要帮助从PHP调用Oracle包函数

时间:2014-12-18 20:41:55

标签: php oracle plsql stored-functions

我提供了一个函数作为Oracle包的一部分,如下所示:

packageX.functionY(a_project VARCHAR2,a_centers OUT Strings,a_types OUT Strings,a_values OUT Int32s);

我目前在Toad上运行此操作的唯一方法如下:

DECLARE  
  a_centers Strings; 
  a_types Strings; 
  a_values Int32s; 
  n INTEGER :=0 ; 
BEGIN 
  packageX.functionY('myproject', a_centers, a_types, a_values); 
  n := a_centers.count; 
  DBMS_OUTPUT.PUT_LINE('Test Result for packageX.functionY'); 
  FOR i in 1..n LOOP 
     DBMS_OUTPUT.PUT_LINE( a_centers(i)  || '   '   ||  a_types(i) || '   '  ||      TO_CHAR(a_values(i))); 
  END LOOP; 
END;

我不知道如何用PHP读取DBMS_OUTPUT。我读到这不是一个好习惯。 我阅读了很多示例和Oracle文档如何调用包函数,但似乎没有任何帮助我的情况。我感觉'问题的一部分是函数的OUT参数,但我不确定。

我的问题有两个方面。

1)用PHP读取DBMS_OUTPUT真的是个坏主意吗?如果不是我该怎么办?

2)有没有办法直接返回数据而不使用我可以用php上的oci函数读取的DBMS_OUTPUT?

1 个答案:

答案 0 :(得分:2)

我很久以前就没有将PHP用于Oracle,但是如果我记得很清楚,要使用带OCI的PHP获取集合,你需要bind the output parameter作为右边的a collection类型。 喜欢的东西:

$q = oci_parse($conn,"CALL packageX.functionY('myproject', :r, :s, :t)");

$r = oci_new_collection($this->db, 'Strings');
//                                  ^^^^^^^
//                      not sure about that though
oci_bind_by_name($q, ':r', $r, -1, SQLT_NTY);
oci_bind_by_name(...)
...
oci_execute($q);

// do whatever you need with your data
$data = $elem = $collection->getElem(1);

// then discard it
$r->free();
     

未测试。谨防拼写错误 - 可能需要一些调整......

有一个similar question a few days ago。也许这对你也有帮助。