powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Dynamic DML with RETURNING
17 сообщений из 17, страница 1 из 1
Dynamic DML with RETURNING
    #39770599
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте

Как (если вообще) можно организовать нечто подобное одним оператором DELETE (без предварительной выборки SELECT FOR UPDATE) ?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create table tmp$tab1 as select level a, level+1 b from dual connect by level <= 10
/

declare
    x dbms_sql.number_table;
    table_name varchar2(30) := 'TMP$TAB1';
begin
    execute immediate 'delete from ' || table_name || ' where a > 5 returning b bulk collect into :x' using out x;
    for i in 1..x.count loop
        dbms_output.put_line(x(i));
    end loop;
end;
/
...
Рейтинг: 0 / 0
Dynamic DML with RETURNING
    #39770602
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--,

bulk collect это plsql-ное расширение.
...
Рейтинг: 0 / 0
Dynamic DML with RETURNING
    #39770606
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-bulk collect это plsql-ное расширение.Ну дак вопрос в том как вернуть строки из динамического DML.
Код: plsql
1.
execute immediate 'delete from t' returning b bulk collect into x

- это ведь тоже не проканает
...
Рейтинг: 0 / 0
Dynamic DML with RETURNING
    #39770617
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--какЧто в кавычках execute immediate - это sql, что снаружи - это plsql. Cинтаксис sql описан в sql reference, синтаксис plsql в plsql reference.
В приведенном варианте b не соответствует синтаксису plsql.
Код: plsql
1.
execute immediate 'delete from t' returning b bulk collect into x
...
Рейтинг: 0 / 0
Dynamic DML with RETURNING
    #39770623
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-не соответствуетэто понятно, что не соответствует.
если бы я знал как написать так, чтобы соответствовал, то не стал бы вопрос задавать.
скажите лучше, есть ли возможность вернуть строки из динамического DML ?
...
Рейтинг: 0 / 0
Dynamic DML with RETURNING
    #39770627
Да ну
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--скажите лучше, есть ли возможность вернуть строки из динамического DML ?
Если данных заведомо немного, то, например, returning listagg(...) into :x
...
Рейтинг: 0 / 0
Dynamic DML with RETURNING
    #39770633
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--есть ли возможность вернуть строки из динамического DML ?да.
Смотришь в sql reference как вернуть строки в хост-переменную, в plsql reference как эти значения в вернуть в коллекцию.
...
Рейтинг: 0 / 0
Dynamic DML with RETURNING
    #39770649
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нуreturning listagg(...) into :xинтересует именно bulk collect into
-2-да.на этом форуме зачастую такое ощущение, будто я чем-то помешал сидящим тут мирно попивающим кофий с корицею хранителям знаний. никак не могу привыкнуть.
можно ли скромно надеяться на пример?
...
Рейтинг: 0 / 0
Dynamic DML with RETURNING
    #39770666
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--Как (если вообще) можно организовать нечто подобное одним оператором DELETE (без предварительной выборки SELECT FOR UPDATE) ?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> create type tmp$ints as table of int;
  2  /

Type created.

SQL> declare
  2      x tmp$ints;
  3      table_name varchar2(30) := 'TMP$TAB1';
  4  begin
  5      execute immediate 'begin delete from ' || table_name || ' where a > 5 returning b bulk collect into :x; end;' using out x;
  6      for i in 1..x.count loop
  7          dbms_output.put_line(x(i));
  8      end loop;
  9  end;
 10  /
7
8
9
10
11

PL/SQL procedure successfully completed.
...
Рейтинг: 0 / 0
Dynamic DML with RETURNING
    #39770677
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--можно ли скромно надеяться на пример?Практически пример:-2-Смотришь в sql reference как вернуть строки в хост-переменную, в plsql reference как эти значения в вернуть в коллекцию.
...
Рейтинг: 0 / 0
Dynamic DML with RETURNING
    #39770680
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
Код: plsql
1.
...execute immediate 'begin...

нет, позвольте, это ведь уже анонимный блок, а не DML
...
Рейтинг: 0 / 0
Dynamic DML with RETURNING
    #39770683
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--нет, позвольте, это ведь уже анонимный блок, а не DMLТак ведь же
--Eugene--без предварительной выборки SELECT FOR UPDATEШашечки или ехать?
...
Рейтинг: 0 / 0
Dynamic DML with RETURNING
    #39770687
Алекссс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--,

Код: plsql
1.
execute immediate 'delete from ' || table_name || ' returning b into :1' RETURNING bulk collect into x;
...
Рейтинг: 0 / 0
Dynamic DML with RETURNING
    #39770689
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
create table dropme_t(a, b)
as select rownum, 'v'||rownum from dual connect by level < 10;

Table created

declare
    type t_b is table of varchar2(100) index by binary_integer;
    x t_b;
    table_name varchar2(30) := 'DROPME_T';
begin
    execute immediate 'delete ' || table_name || ' where a > 5 returning b into :x' returning bulk collect into x;
    for i in 1..x.count loop
        dbms_output.put_line(x(i));
    end loop;
end;
/

v6
v7
v8
v9
PL/SQL procedure successfully completed

SQL> 
...
Рейтинг: 0 / 0
Dynamic DML with RETURNING
    #39770708
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот он, нужный синтаксис:
Код: plsql
1.
execute immediate 'delete t returning b into :x' returning bulk collect into x

однако, довольно странно - внутри просто RETURNING, а снаружи RETURNING BULK COLLECT.
а я-то думал, что RETURNING - это для одной строки, а RETURNING BULK COLLECT - для нескольких
...
Рейтинг: 0 / 0
Dynamic DML with RETURNING
    #39770709
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--а я-то думал, что RETURNING - это для одной строки, а RETURNING BULK COLLECT - для нескольких
Bulk collect - это PL/SQL.
...
Рейтинг: 0 / 0
Dynamic DML with RETURNING
    #39770716
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

да понял я
понял
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Dynamic DML with RETURNING
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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