Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не получается выбрать значеия из коллекции через from table(...) / 12 сообщений из 12, страница 1 из 1
03.03.2022, 19:10
    #40137424
zorlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается выбрать значеия из коллекции через from table(...)
Приветствую, ребята! На простом примере пытаюсь загрузить данные из таблички в коллекцию, потом сделать с неё select, но ругается на тип: PLS-00642 local collection types not allowed in sql statement.

Вот что, делаю:

1) Создаю табличку

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TABLE TEST
(
  ISN    NUMBER                                 NOT NULL,
  CID    NUMBER                                 NOT NULL,
  RID    NUMBER                                 NOT NULL,
  VALUE  NUMBER,
  TYPE   VARCHAR2(1 BYTE),
  DATER  DATE
);


insert into TEST (isn, cid, rid, value, type, dater)
values ('234', '309', '359', '79', 'D', to_date('31.12.2021', 'dd.mm.yyyy'));

insert into TEST (isn, cid, rid, value, type, dater)
values ('274', '309', '359', '47', 'D', to_date('31.12.2021', 'dd.mm.yyyy'));

insert into TEST (isn, cid, rid, value, type, dater)
values ('294', '309', '333', '22', 'D', to_date('31.12.2021', 'dd.mm.yyyy'));
commit;




2) Затем пытаюсь выполнить такой скрипт:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DECLARE

 TYPE test_values_set IS TABLE OF test%ROWTYPE;
 underpaid test_values_set;

BEGIN

SELECT * BULK COLLECT 
  INTO underpaid 
  FROM test
 WHERE dater = to_date('31.12.2021', 'dd.mm.yyyy');

select * from table(underpaid);

 end;




Подскажите, что не так делаю?
...
Рейтинг: 0 / 0
03.03.2022, 20:13
    #40137426
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается выбрать значеия из коллекции через from table(...)
zorlo
PLS-00642 local collection types not allowed in sql statement.
...
Подскажите, что не так делаю?


Нельзя использоваться PL/SQL тип, тип нужно объявлять на уровне базы CREATE TYPE.

AFAIK
...
Рейтинг: 0 / 0
03.03.2022, 20:44
    #40137431
mnbvcx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается выбрать значеия из коллекции через from table(...)
Leonid Kudryavtsev
zorlo
PLS-00642 local collection types not allowed in sql statement.
...
Подскажите, что не так делаю?


Нельзя использоваться PL/SQL тип, тип нужно объявлять на уровне базы CREATE TYPE.

AFAIK

А если на уровне пакета?
...
Рейтинг: 0 / 0
03.03.2022, 22:19
    #40137445
ASNexus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается выбрать значеия из коллекции через from table(...)
mnbvcx
Leonid Kudryavtsev
пропущено...


Нельзя использоваться PL/SQL тип, тип нужно объявлять на уровне базы CREATE TYPE.

AFAIK

А если на уровне пакета?


Тип, объявленный в спецификации пакета, можно использовать в SQL-запросах SELECT, в запросах DML - нельзя (возможно, в каких-то новых версиях это изменилось, не знаю).

Объявленный в теле пакета - нельзя ни в каких в SQL-запросах.
...
Рейтинг: 0 / 0
03.03.2022, 22:41
    #40137452
mnbvcx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается выбрать значеия из коллекции через from table(...)
ASNexus, ну я это и имел в виду, что не обязательно на уровне схемы тип объявлять.
...
Рейтинг: 0 / 0
03.03.2022, 23:43
    #40137461
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается выбрать значеия из коллекции через from table(...)
zorlo
Код: plsql
1.
select * from table(underpaid);


Подскажите, что не так делаю?
Конкретно тут ты пытаешься выбрать данные "в никуда". Если ты их хочешь просто посмотреть в целях тестирования, то напиши цикл по массиву и выведи в консоль через dbms_output
...
Рейтинг: 0 / 0
04.03.2022, 10:12
    #40137509
zorlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается выбрать значеия из коллекции через from table(...)
oragraf
zorlo
Код: plsql
1.
select * from table(underpaid);


Подскажите, что не так делаю?
Конкретно тут ты пытаешься выбрать данные "в никуда". Если ты их хочешь просто посмотреть в целях тестирования, то напиши цикл по массиву и выведи в консоль через dbms_output


Да, это понятно. Я этот пример просто написал, чтобы разобраться почему не работает обращение коллекции через table().
Идея была в том, чтобы использовать в коллекцию в имеющем запросе в джойне (вместо истенной таблицы), который собирается динамически, записывается в переменную, а потом выполняется.

Но суть в том, что, хотелось бы, чтобы выполнился подобный кусок в процедуре.
...
Рейтинг: 0 / 0
04.03.2022, 10:22
    #40137515
zorlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается выбрать значеия из коллекции через from table(...)
zorlo,

Дополню, чего хотел бы пока, чтобы отрабатывало без ошибок.

Создаём ещё табличку

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE TEST1
(
  id    NUMBER                                 NOT NULL,
  TYPER   VARCHAR2(1 BYTE)
);

insert into TEST1 (id, TYPER)
values('333', 'T');
insert into TEST1 (id, TYPER)
values('359', 'R');
commit;




И вот, что хотел бы, чтобы заработало:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DECLARE

 TYPE test_values_set IS TABLE OF test%ROWTYPE;
 underpaid test_values_set;

BEGIN

SELECT * BULK COLLECT 
  INTO underpaid 
  FROM test
 WHERE dater = to_date('31.12.2021', 'dd.mm.yyyy');

SELECT value, type from (
  select value, type FROM table(underpaid) v1 inner join test v2
  on v1.id = v2.rid
 );

 end;
...
Рейтинг: 0 / 0
04.03.2022, 10:29
    #40137518
zorlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается выбрать значеия из коллекции через from table(...)
zorlo,

Тип можно объявить только на уровне схемы? На уровне пакета нельзя?
Как правильно это сделать?
Вот так не срабатывает

CREATE OR REPLACE TYPE test_values_set IS TABLE OF test%ROWTYPE;
...
Рейтинг: 0 / 0
04.03.2022, 12:44
    #40137543
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается выбрать значеия из коллекции через from table(...)
zorlo, не тупи
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
declare
    type tt is table of dual%rowtype;
    t tt;
    i pls_integer;
begin
    select * bulk collect into t from (select * from dual union all select * from dual);

    i := t.first;
    while (i is not null)
    loop
        dbms_output.put_line(t(i).dummy);
        i := t.next(i);
    end loop;

end;
...
Рейтинг: 0 / 0
04.03.2022, 13:32
    #40137550
zorlo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается выбрать значеия из коллекции через from table(...)
oragraf,

Да это понятно, как вывести элементы.
Но мне нужно обращение к коллекции через select
...
Рейтинг: 0 / 0
04.03.2022, 18:07
    #40137617
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается выбрать значеия из коллекции через from table(...)
zorlo,

попробуйте с CAST:
Код: plsql
1.
select * from TABLE(CAST(underpaid as test_values_set))
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не получается выбрать значеия из коллекции через from table(...) / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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