Нужна помощь в вызове функции пакета Oracle из переполнения стека

Мне предоставляется функция как часть пакета 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?

1

Решение

Я не использовал 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();

Непроверенные. Остерегайтесь опечаток — и, возможно, нуждаются в некоторых корректировках …

Был похожий вопрос несколько дней назад. Может быть, это может помочь вам тоже.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]