我提供了一个函数作为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?
答案 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。也许这对你也有帮助。