Мне предоставляется функция как часть пакета Oracle, как показано ниже:
packageX.functionY (a_project VARCHAR2, a_centers OUT Strings, a_types OUT Strings, a_values OUT Int32s);
Единственный способ, которым я могу в настоящее время запустить это на жабе, является следующим:
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();
Непроверенные. Остерегайтесь опечаток — и, возможно, нуждаются в некоторых корректировках …
Был похожий вопрос несколько дней назад. Может быть, это может помочь вам тоже.
Других решений пока нет …