В документе OCI говорится, что курсор и вложенная таблица имеют одинаковый тип привязки SQLT_RSET, но они не

http://docs.oracle.com/cd/B14117_01/appdev.101/b10779/oci05bnd.htm#422771

раздел PL/SQL REF CURSOR и вложенные таблицы в OCI

говорит, что SQLT_RSET передается для параметра dty.

Если я использую SQLT_RSET для возвращаемого значения функции, которая возвращает таблицу, и передаю адрес дескриптора оператора для указателя данных параметра OCI, я ожидал, что дескриптор оператора будет создан в результате выполнения функции, над которой я могу выполнять дальнейшие действия. выборка, похожая на курсор. Но выдает исключение PLS-00382: выражение имеет неправильный тип ORA-06550: строка 2, столбец 3. Верна ли приведенная выше документация?

Из заголовочного файла OCI я вижу, что для varray и вложенной таблицы упоминается использование SQLT_NCO. Я не смог найти в документации OCI примера того, как передать или получить в качестве возвращаемого значения вложенное значение при использовании SQLT_NCO.

Пожалуйста, помогите, прежде чем я застрелюсь.


person Hugh Darling    schedule 15.09.2013    source источник


Ответы (1)


Если вы внимательно изучите примеры, вы увидите, что вложенная таблица используется в сочетании с функцией cursor(). Например.

static const text *nst_tab = (text *)
       "SELECT last_name, CURSOR(SELECT department_name, location_id \
        FROM  departments)  FROM employees WHERE last_name = 'FORD'";

где ключевая часть вашего вопроса

CURSOR(SELECT department_name, location_id FROM  departments)

где departments — вложенная таблица.
Поэтому, если вам нужно использовать вложенную таблицу в качестве курсора, вам нужно select из нее и преобразовать в тип курсора.

В случае переменной коллекции PL/SQL, если тип ее записи определен на уровне схемы базы данных, вы можете привести ее к таблице, а затем выбрать из нее, чтобы получить курсор:

declare
  vMyTable TMyTableType;
  vCursor  sys_refcursor;
begin
  -- populate table with values ...

  open vCursor for (
    select * from table(vMyTable);
  );

  :OutCursorParameter := vCursor;
end;
person ThinkJet    schedule 16.09.2013
comment
Хорошо, это многое объясняет. Но мое требование состоит в том, чтобы вызвать хранимую функцию, которая возвращает курсор или вложенную таблицу, и из документации, которую я цитировал, я предположил, что могу связать их обоих одинаково, используя SQLT_RSET и OCIStmt*. У меня нет привилегии делать выбор поверх вложенной таблицы, потому что нет способа получить метаданные о возвращаемом типе, не так ли? - person Hugh Darling; 16.09.2013