Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Работа с коллекциями / 19 сообщений из 19, страница 1 из 1
28.05.2021, 11:54
    #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
28.05.2021, 12:01
    #40073768
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с коллекциями
ARRay001
Сейчас дает не соответствие типов в подзапросе с table...
Никогда не пересказывай ошибки своими словами.
А код приводи более подробно, чтобы были видны типы переменных.
И указывай версию.
...
Рейтинг: 0 / 0
28.05.2021, 12:05
    #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
28.05.2021, 13:23
    #40073781
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с коллекциями
Вот так работало, с другой коллекцией:

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



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

Цель: получить список id из коллекции в подзапросе, не прогоняя в цикле, по условию как выше.
...
Рейтинг: 0 / 0
28.05.2021, 13:31
    #40073783
SY
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
28.05.2021, 13:52
    #40073787
SY
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
28.05.2021, 13:54
    #40073788
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с коллекциями
SY,
а как же тогда select column_value from table(myCol) работало?

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

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

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


22328424

SY.
...
Рейтинг: 0 / 0
28.05.2021, 14:01
    #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
28.05.2021, 14:04
    #40073794
SY
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
28.05.2021, 14:06
    #40073795
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с коллекциями
SeaGate
Пакетные коллекции только для SELECT. Для non-query DML это не поддерживается.


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

SY,
...
Рейтинг: 0 / 0
28.05.2021, 14:08
    #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
28.05.2021, 14:15
    #40073801
ARRay001
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с коллекциями
SY,
Понял - только для SELECT... ясно. Может какой-то другой способ есть сделать нечто подобное?
...
Рейтинг: 0 / 0
28.05.2021, 14:22
    #40073805
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с коллекциями
ARRay001

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


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

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

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

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


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