powered by simpleCommunicator - 2.0.43     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не получается выбрать значеия из коллекции через from table(...)
12 сообщений из 12, страница 1 из 1
Не получается выбрать значеия из коллекции через from table(...)
    #40137424
zorlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую, ребята! На простом примере пытаюсь загрузить данные из таблички в коллекцию, потом сделать с неё 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
Не получается выбрать значеия из коллекции через from table(...)
    #40137426
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zorlo
PLS-00642 local collection types not allowed in sql statement.
...
Подскажите, что не так делаю?


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

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


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

AFAIK

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


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

AFAIK

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


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

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


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


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


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

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

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

CREATE OR REPLACE TYPE test_values_set IS TABLE OF test%ROWTYPE;
...
Рейтинг: 0 / 0
Не получается выбрать значеия из коллекции через from table(...)
    #40137543
oragraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Не получается выбрать значеия из коллекции через from table(...)
    #40137550
zorlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
oragraf,

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

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


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