Есть ли способ использовать таблицу varchar 2 в операторе select - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть хранимая функция, которая возвращает таблицу varchar2.И я хочу использовать его в выбранной

хранимой функции: -

create or replace PACKAGE TESTSTR AS 

 TYPE strings_t IS TABLE OF VARCHAR2 (4000);

FUNCTION strings
   RETURN strings_t; 

END TESTSTR;

select * from  TABLE (TESTSTR.strings())

это вызывает у меня недопустимый тип данных ошибка

ORA-00902: недопустимый тип данных

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Если вы хотите использовать свой список за пределами PL / SQL, как в вашем посте, вам нужно определить тип OBJECT в базе данных. Например,

CREATE OR REPLACE TYPE my_string AS OBJECT (val varchar2(4000));
CREATE OR REPLACE TYPE my_string_t AS TABLE OF my_string;

... и затем используйте my_string_t вместо вашего PL / SQL strings_t типа.

Поскольку ваш список строк содержит менее 32768 элементов, вы можете вместо этого использовать предопределенный тип объекта SYS.ODCIVARCHAR2LIST, избавляя вас от необходимости объявлять любые новые типы объектов.

Например,

CREATE OR REPLACE PACKAGE teststr AS
  FUNCTION strings RETURN sys.odcivarchar2list;
END teststr;

CREATE OR REPLACE PACKAGE BODY teststr AS
  FUNCTION strings RETURN sys.odcivarchar2list IS
    l_list sys.odcivarchar2list;
  BEGIN
    SELECT rownum 
    BULK COLLECT INTO l_list
    FROM DUAL
    CONNECT BY ROWNUM <= 1000;

    RETURN l_list;
  END strings;
END teststr;

SELECT * FROM table(teststr.strings);
0 голосов
/ 25 апреля 2019

Создать функцию с указанным ниже параметром, например, строки функций, возвращать string_t конвейерной является - объявить переменную вашего типа как пустое начало - введите вашу логику здесь конвейерную строку (out_variable);исключение - если любой конец;

выйти с помощью запроса: выберите * из таблицы (tester.strings);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...