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


Need help calling an Oracle package function from PHP

我被提供了一个函数作为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?

我很久以前就没有在 Oracle 中使用过 PHP,但是如果我记得不错的话,要使用带有 OCI 的 PHP 取回集合,您需要将输出参数绑定为正确类型的集合。这样:

$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();

未经测试。当心错别字 - 可能需要一些调整...

几天前有一个类似的问题。也许这也可以帮助你。