powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / is record vs is object
9 сообщений из 9, страница 1 из 1
is record vs is object
    #40074962
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, коллеги!

Версия 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
is record vs is object
    #40074977
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NET

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

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

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

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

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

.....
stax

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

1. у record нет конструктора
2. функция должна быть pipelined
...
Рейтинг: 0 / 0
is record vs is object
    #40074998
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.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
is record vs is object
    #40075013
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

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

pipelined vs non-pipelined
...
Рейтинг: 0 / 0
is record vs is object
    #40075030
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
is record vs is object
    #40075285
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / is record vs is object
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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