Мне предоставляется функция как часть пакета 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;
Я не знаю, как я могу читать DBMS_OUTPUT с PHP. Я читал, что это не очень хорошая практика. Я прочитал много примеров и документацию Oracle, как вызвать функции пакета, но ничто не помогает в моем случае. Я "чувствую", что часть проблемы - это параметры OUT функции, но я не уверен.
Мой вопрос - две складки.
1) Неужели это плохая идея читать DBMS_OUTPUT с PHP? Если нет, то как это сделать?
2) Есть ли способ напрямую вернуть данные без использования DBMS_OUTPUT, которые я могу читать с функциями oci на php?
Я давно не использовал PHP с Oracle, но если я хорошо его помню, чтобы вернуть коллекцию с помощью PHP с OCI, вам нужно связать выходной параметр как коллекцию нужного типа. Что-то вроде того:
$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();
Непроверенные.Остерегайтесь опечаток - и, вероятно, вам нужны некоторые корректировки...
Несколько дней назад был аналогичный вопрос. Может быть, это тоже поможет.