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

0

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

  • 0
    Можете ли вы создать другую функцию / процедуру / представление, которая вызывает эту функцию и вызывает этот новый объект из PHP? Или вам действительно нужен код PHP для выполнения анонимного блока PL / SQL?
  • 0
    У меня нет прав на создание / запись на стороне Oracle. Из-за сжатых сроков мне нужно работать с текущей функцией как есть. Благодарю.
Теги:
plsql
stored-functions

1 ответ

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();

Непроверенные.Остерегайтесь опечаток - и, вероятно, вам нужны некоторые корректировки...

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню