powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Работа с коллекциями
19 сообщений из 19, страница 1 из 1
Работа с коллекциями
    #40073767
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дорого времени суток!

Подскажите, можно ли так писать? Или как иначе?
myCol точно содержит поля id и r. Будет ещё обработка Exception на отсутствие записи (а если оно внутри update - ошибка изменится?).
Сейчас дает не соответствие типов в подзапросе с table...

Код: plsql
1.
2.
3.
4.
5.
update (select t.v, t.r
                   from tab1 t inner join tab2 v on v.v = t.v
                  where t.id in (select id from table(myCol) where r = t.r)
              ) tt        
          set tt.v = null, tt.v = nvl(tt.v, 0) + 1;
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40073768
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001
Сейчас дает не соответствие типов в подзапросе с table...
Никогда не пересказывай ошибки своими словами.
А код приводи более подробно, чтобы были видны типы переменных.
И указывай версию.
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40073769
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,
В pkgFunc:
type t_myCol is table of tab1%rowtype;

в Declare процедуры:
myCol pkgFunc.t_myCol:= pkgFunc.t_myCol();

Ошибка: invalid datatype

Oracle Database 18c Enterprise Edition Release 18.0.0.0.0
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40073781
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот так работало, с другой коллекцией:

Код: plsql
1.
select column_value from table(l_id_tab)



Возможно, синтаксис выше некорректен.

Цель: получить список id из коллекции в подзапросе, не прогоняя в цикле, по условию как выше.
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40073783
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты сообщения об ошибках читаешь также как и приводишь?

Код: 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.
declare
    type t_myCol is table of dept%rowtype;
    v_tbl t_myCol;
    v_cnt number;
begin
    v_tbl(1).deptno := 10;
    v_tbl(1).dname := 'NEW YORK';
    v_tbl(1).loc := 'ACCOUNTING';
    select  count(*)
      into  v_cnt
      from  table(v_tbl);
end;
/
      from  table(v_tbl);
                  *
ERROR at line 11:
ORA-06550: line 11, column 19:
PLS-00642: local collection types not allowed in SQL statements
ORA-06550: line 11, column 13:
PL/SQL: ORA-22905: cannot access rows from a non-nested table item
ORA-06550: line 9, column 5:
PL/SQL: SQL Statement ignored


SQL>



Используй SQL типы.

SY.
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40073787
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY

Используй SQL типы.


Или пакетный тип (я лично предпочитаю не использовать ибо это все равно неявно создает системно-генерированные обьектный и коллекционные SQL типы):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create or replace
  package pkg1
    is
      type t_myCol is table of dept%rowtype;
end;
/
declare
    v_tbl pkg1.t_myCol := pkg1.t_myCol();
    v_cnt number;
begin
    v_tbl.extend;
    v_tbl(1).deptno := 10;
    v_tbl(1).dname := 'NEW YORK';
    v_tbl(1).loc := 'ACCOUNTING';
    select  count(*)
      into  v_cnt
      from  table(v_tbl);
end;
/

PL/SQL procedure successfully completed.

SQL>



SY.
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40073788
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,
а как же тогда select column_value from table(myCol) работало?

И коллекция же заполняется в другом пакете - в самой процедуре ничего не расширяется и не добавляется.

Заполнение делается select t.* bulk collect into
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40073791
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001

а как же тогда select column_value from table(myCol) работало?


22328424

SY.
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40073792
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пакетные коллекции только для SELECT. Для non-query DML это не поддерживается.
Код: 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 table tab1(
  2    id int,
  3    v int,
  4    r int);

Table created.

SQL>
SQL> create or replace package pkgFunc
  2  is
  3    type t_myCol is table of tab1%rowtype;
  4  end;
  5  /

Package created.

SQL>
SQL> declare
  2    myCol pkgFunc.t_myCol := pkgFunc.t_myCol();
  3  begin
  4    myCol.extend(2);
  5    myCol(1).id := 100;
  6    myCol(2).id := 200;
  7    for c in (select * from table(myCol))
  8    loop
  9      dbms_output.put_line(c.id);
 10    end loop;
 11    update (select t.v, t.r
 12                   from tab1 t
 13             where t.id in (select id from table(myCol) where r = t.r)
 14            ) tt
 15       set tt.v = null, tt.v = nvl(tt.v, 0) + 1;
 16  end;
 17  /
100
200
declare
*
ERROR at line 1:
ORA-00902: invalid datatype
ORA-06512: at line 11
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40073794
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То же и с associative array:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create or replace
  package pkg1
    is
      type t_myCol is table of dept%rowtype index by binary_integer;
end;
/
declare
    v_tbl pkg1.t_myCol; -- := pkg1.t_myCol();
    v_cnt number;
begin
--    v_tbl.extend;
    v_tbl(1).deptno := 10;
    v_tbl(1).dname := 'NEW YORK';
    v_tbl(1).loc := 'ACCOUNTING';
    select  count(*)
      into  v_cnt
      from  table(v_tbl);
end;
/

PL/SQL procedure successfully completed.

SQL>



SY.
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40073795
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeaGate
Пакетные коллекции только для SELECT. Для non-query DML это не поддерживается.


Спасибо, не знал (видимо потому что предпочитаю не использовать ).

SY,
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40073796
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с associative array это явно указано:
https://docs.oracle.com/database/121/LNPLS/release_changes.htm#GUID-57E439FB-B196-46CB-857C-0ADAB32D9EA0
авторIf the PL/SQL-only data type is an associative array, it cannot be used within a non-query DML statement (INSERT, UPDATE, DELETE, MERGE) nor in a subquery.
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40073801
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,
Понял - только для SELECT... ясно. Может какой-то другой способ есть сделать нечто подобное?
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40073805
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001

Не совсем понял, получается, если коллекция заполняется в другом пакете по вызову тамошней процедуры, то уже не сработает? Только если заполнять построчно в той же процедуре? Или есть какой-то иной способ для этого случая?


Где заполняется значения не имеет. Главное где определен тип - в пакете или нет.

SY.
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40073811
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

Супер, только тогда смысла нет. Процедура заполнения всё равно в другом пакете и передавать между пакетами всё равно придётся...
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40073826
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблем с передачей коллекций между пакетами в пределах одной БД нет.
Передача между БД требует внимания, но тоже возможна.
В топике не понятно только одно - нафига вообще применять DML к коллекциям?
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40073962
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,
DML в примере применяется не к коллекции, коллекция служит только для выборки данных для DML.
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40073996
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARRay001,

Используйте forall
...
Рейтинг: 0 / 0
Работа с коллекциями
    #40074002
ARRay001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,
думаю тут он не поможет. Уже сделал обычным способом.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Работа с коллекциями
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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