我被提供了一个函数作为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();
未经测试。当心错别字 - 可能需要一些调整...
几天前有一个类似的问题。也许这也可以帮助你。