Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / is record vs is object / 9 сообщений из 9, страница 1 из 1
02.06.2021, 11:15
    #40074962
.NET
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
is record vs is object
Добрый день, коллеги!

Версия Oracle: 19c Enterprise 19.0.0.0.0.
Хочу написать функцию возвращающую таблицу.
На уровне схемы получается неплохо
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE OR REPLACE TYPE STR_RECORD IS OBJECT(
    STR1 VARCHAR2(255),
    STR2 VARCHAR2(255)
  )
/
CREATE OR REPLACE TYPE STR_TABLE IS TABLE OF STR_RECORD
/
CREATE OR REPLACE FUNCTION GET_STR_TABLE
  RETURN STR_TABLE IS
  TBL STR_TABLE;
BEGIN
  SELECT STR_RECORD('STR1_VAL', 'STR2_VAL')
  BULK COLLECT INTO TBL
  FROM DUAL;

  RETURN TBL;
END;
/
SELECT * FROM TABLE(GET_STR_TABLE)



Теперь хотелось бы убарть функцию в пакет. Однако, тут возникают проблемы, потому что объекты не поддерживаются в контексте пакета. Если заменить IS OBJECT на IS RECORD, как-то так

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
CREATE OR REPLACE PACKAGE TEST AS
  TYPE STR_RECORD IS RECORD(
      STR1 VARCHAR2(255),
      STR2 VARCHAR2(255)
    );

  TYPE STR_TABLE IS TABLE OF STR_RECORD;

  FUNCTION GET_STR_TABLE
    RETURN STR_TABLE;
END;
/

CREATE OR REPLACE PACKAGE BODY TEST AS
  FUNCTION GET_STR_TABLE
    RETURN STR_TABLE IS
    TBL STR_TABLE;
  BEGIN
   SELECT STR_RECORD('STR1_VAL', 'STR2_VAL')
   BULK COLLECT INTO TBL
   FROM DUAL;

    RETURN TBL;
  END;
END;
/
SELECT * FROM TABLE(TEST.GET_STR_TABLE)


то я получаю на селекте ошибку компиляции ORA-00913: слишком много значений.
Если заменить SELECT STR_RECORD('STR1_VAL', 'STR2_VAL') на SELECT 'STR1_VAL', 'STR2_VAL', то функция компилируется, но падает при вызове с ошибкой ORA-00902: неверный тип данных.
Как мне убрать обозначенную выше функцию GET_STR_TABLE в пакет?
...
Рейтинг: 0 / 0
02.06.2021, 11:49
    #40074977
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
is record vs is object
.NET

потому что объекты не поддерживаются в контексте пакета.

в каком смысле не поддерживаются?

.....
stax
...
Рейтинг: 0 / 0
02.06.2021, 11:59
    #40074983
.NET
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
is record vs is object
Stax
.NET

потому что объекты не поддерживаются в контексте пакета.

в каком смысле не поддерживаются?

.....
stax

ORA-00540: объект не поддерживается в этом контексте
...
Рейтинг: 0 / 0
02.06.2021, 12:29
    #40074996
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
is record vs is object
.NET,

1. у record нет конструктора
2. функция должна быть pipelined
...
Рейтинг: 0 / 0
02.06.2021, 12:33
    #40074998
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
is record vs is object
.NET,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
SQL> CREATE OR REPLACE PACKAGE TEST_net AS
  2
  3    FUNCTION GET_STR_TABLE
  4      RETURN STR_TABLE;
  5  END;
  6  /

Пакет создан.

SQL> CREATE OR REPLACE PACKAGE BODY TEST_net AS
  2    FUNCTION GET_STR_TABLE
  3      RETURN STR_TABLE IS
  4      TBL STR_TABLE;
  5    BEGIN
  6     SELECT STR_RECORD('STR1_VAL', 'STR2_VAL')
  7     BULK COLLECT INTO TBL
  8     FROM DUAL;
  9
 10      RETURN TBL;
 11    END;
 12  END;
 13  /

Тело пакета создано.


SQL> ed
Записано file afiedt.buf

  1* SELECT * FROM TABLE(TEST_net.GET_STR_TABLE)
SQL> /

STR1
--------------------------------------------------------------------------------
STR2
--------------------------------------------------------------------------------
STR1_VAL
STR2_VAL


SQL>



.....
stax
...
Рейтинг: 0 / 0
02.06.2021, 13:01
    #40075013
.NET
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
is record vs is object
Stax,

Да, действительно, если типы вообще не объявлять, то все прекрасно работает, если типы уже определены до этого на уровне схемы.
Спасибо.
...
Рейтинг: 0 / 0
02.06.2021, 13:07
    #40075015
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
is record vs is object
.NET
функцию возвращающую таблицу.
если хотите использовать в SQL, делайте лучше pipelined функцию с pipe row (STR_RECORD('STR1_VAL', 'STR2_VAL'))

pipelined vs non-pipelined
...
Рейтинг: 0 / 0
02.06.2021, 13:45
    #40075030
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
is record vs is object
oragraf
.NET,

1. у record нет конструктора


Зависит от версии:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SQL> select banner from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production

SQL> DECLARE
  2      TYPE STR_RECORD IS RECORD(
  3                                STR1 VARCHAR2(255),
  4                                STR2 VARCHAR2(255)
  5                               );
  6      V_STR_RECORD STR_RECORD;
  7  BEGIN
  8      V_STR_RECORD := STR_RECORD('ABC','DEF');
  9  END;
 10  /

PL/SQL procedure successfully completed.

SQL>



SY.
...
Рейтинг: 0 / 0
03.06.2021, 00:54
    #40075285
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
is record vs is object
SY
Зависит от версии:

Прикольно, и правда:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare
    type str_record is record(
        str1 varchar2(255) not null := 'AA',
        str2 varchar2(255));
    v_str_record str_record := str_record(str2 => 'DEF');
begin
    null;
end;
/

Спасибо, Соломон.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / is record vs is object / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]