2014-12-18 7 views
0

Я предоставил функцию как часть пакета Oracle, как показано ниже:Нужна помощью вызова функции пакета Oracle из PHP

packageX.functionY (a_project VARCHAR2, a_centers OUT струнных a_types OUT струнного 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?

+0

Можете ли вы создать другую функцию/процедуру/представление, которая вызывает эту функцию и вызывает этот новый объект из PHP? Или вам действительно нужен PHP-код для выполнения анонимного блока PL/SQL? –

+0

У меня нет привилегий создания/записи на стороне Oracle. Из-за ограниченного срока я должен работать с текущей функцией, как есть. Благодарю. – icramc

ответ

1

Я давно не использовал PHP с Oracle, но если я его хорошо помню, чтобы вернуть коллекцию с использованием PHP с OCI, вам необходимо указать 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. Может быть, это тоже поможет.