PHP - PL / SQL: Как считать массив (как параметр OUT из процедуры Oracle) в PHP - PullRequest
1 голос
/ 16 апреля 2020

У меня есть процедура в моей Oracle БД с массивом в качестве выходного параметра. В этой процедуре я помещаю все команды с их точками в массив.

create or replace package pck_tournament
as

  type trranking  is record (
            position  number
       ,    team   VARCHAR2(20)
       ,    points  number 
  );
  type taranking is table of trranking;

  procedure retrieve_ranking (oparray  out taranking);
end pck_tournament;

Но когда я пытаюсь вызвать эту процедуру с PHP, я всегда получаю ошибку, подобную этой:

PLS-00306: неверный номер или типы аргументов при вызове 'RETRIEVE_RANKING'

Это часть моего PHP кода:

$out_arr = array();   
    $stmt = oci_parse($conn, "BEGIN pck_tournament.retrieve_ranking(:taranking); END;");
    oci_bind_array_by_name($stmt,":taranking", $out_arr, 10000, 10000, SQLT_CHR );
    oci_execute($stmt); 

Если я измените параметр OUT на VARCHAR2 для тестирования, я могу прочитать результат. Но я не могу заставить его работать, если это массив.

Итак, проблема в том, что я использую неверный тип аргумента для хранения моего параметра OUT?

Я искал много сайтов, но все еще не знаю, как заставить это работать.

1 Ответ

1 голос
/ 16 апреля 2020

То, что у вас есть в oracle, это не просто массив, это массив записей .... Так что стандартный массив в PHP не сможет с этим справиться.

Согласно приведенному ниже вопросу о переполнении стека, вы должны указать PHP, как будет выглядеть тип

PHP: привязка переменной к выходному параметру табличного типа

Так что используйте ниже (подставляя ваш тип и схему)

$table_output = oci_new_collection($conn,'some_table_type','schema');

Другой вопрос также содержит ссылку на хороший ресурс для получения дополнительной информации об этом.

Как указано на @ MT0 вам также придется изменить способ определения типов. Вы можете изменить его на возражать как предложено или оставить как запись, но основным изменением будет перемещение объявления за пределы вашего пакета.

PHP не сможет их увидеть, если они определены только в пакете.

...