У меня есть процедура в моей базе данных 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
jvlt 16 Апр 2020 в 00:14

1 ответ

Лучший ответ

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

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

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

Поэтому используйте приведенное ниже (заменив свой тип и схему)

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

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

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

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

1
Shaun Peterson 16 Апр 2020 в 01:48