Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Dynamic DML with RETURNING  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2091
Здравствуйте

Как (если вообще) можно организовать нечто подобное одним оператором DELETE (без предварительной выборки SELECT FOR UPDATE) ?
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;
/
7 фев 19, 12:20    [21803385]     Ответить | Цитировать Сообщить модератору
 Re: Dynamic DML with RETURNING  [new]
-2-
Member

Откуда:
Сообщений: 14350
--Eugene--,

bulk collect это plsql-ное расширение.
7 фев 19, 12:31    [21803394]     Ответить | Цитировать Сообщить модератору
 Re: Dynamic DML with RETURNING  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2091
-2-
bulk collect это plsql-ное расширение.
Ну дак вопрос в том как вернуть строки из динамического DML.
execute immediate 'delete from t' returning b bulk collect into x
- это ведь тоже не проканает
7 фев 19, 12:41    [21803407]     Ответить | Цитировать Сообщить модератору
 Re: Dynamic DML with RETURNING  [new]
-2-
Member

Откуда:
Сообщений: 14350
--Eugene--
как
Что в кавычках execute immediate - это sql, что снаружи - это plsql. Cинтаксис sql описан в sql reference, синтаксис plsql в plsql reference.
В приведенном варианте b не соответствует синтаксису plsql.
execute immediate 'delete from t' returning b bulk collect into x
7 фев 19, 12:54    [21803420]     Ответить | Цитировать Сообщить модератору
 Re: Dynamic DML with RETURNING  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2091
-2-
не соответствует
это понятно, что не соответствует.
если бы я знал как написать так, чтобы соответствовал, то не стал бы вопрос задавать.
скажите лучше, есть ли возможность вернуть строки из динамического DML ?
7 фев 19, 13:01    [21803428]     Ответить | Цитировать Сообщить модератору
 Re: Dynamic DML with RETURNING  [new]
Да ну
Member

Откуда: Первопрестольная
Сообщений: 211
--Eugene--
скажите лучше, есть ли возможность вернуть строки из динамического DML ?

Если данных заведомо немного, то, например, returning listagg(...) into :x
7 фев 19, 13:06    [21803436]     Ответить | Цитировать Сообщить модератору
 Re: Dynamic DML with RETURNING  [new]
-2-
Member

Откуда:
Сообщений: 14350
--Eugene--
есть ли возможность вернуть строки из динамического DML ?
да.
Смотришь в sql reference как вернуть строки в хост-переменную, в plsql reference как эти значения ввернуть в коллекцию.
7 фев 19, 13:16    [21803449]     Ответить | Цитировать Сообщить модератору
 Re: Dynamic DML with RETURNING  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2091
Да ну
returning listagg(...) into :x
интересует именно bulk collect into
-2-
да.
на этом форуме зачастую такое ощущение, будто я чем-то помешал сидящим тут мирно попивающим кофий с корицею хранителям знаний. никак не могу привыкнуть.
можно ли скромно надеяться на пример?
7 фев 19, 13:38    [21803474]     Ответить | Цитировать Сообщить модератору
 Re: Dynamic DML with RETURNING  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28679
--Eugene--
Как (если вообще) можно организовать нечто подобное одним оператором DELETE (без предварительной выборки SELECT FOR UPDATE) ?
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.
7 фев 19, 14:03    [21803496]     Ответить | Цитировать Сообщить модератору
 Re: Dynamic DML with RETURNING  [new]
-2-
Member

Откуда:
Сообщений: 14350
--Eugene--
можно ли скромно надеяться на пример?
Практически пример:
-2-
Смотришь в sql reference как вернуть строки в хост-переменную, в plsql reference как эти значения ввернуть в коллекцию.
7 фев 19, 14:19    [21803517]     Ответить | Цитировать Сообщить модератору
 Re: Dynamic DML with RETURNING  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2091
Elic
...execute immediate 'begin...
нет, позвольте, это ведь уже анонимный блок, а не DML
7 фев 19, 14:26    [21803523]     Ответить | Цитировать Сообщить модератору
 Re: Dynamic DML with RETURNING  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28679
--Eugene--
нет, позвольте, это ведь уже анонимный блок, а не DML
Так ведь же
--Eugene--
без предварительной выборки SELECT FOR UPDATE
Шашечки или ехать?
7 фев 19, 14:29    [21803528]     Ответить | Цитировать Сообщить модератору
 Re: Dynamic DML with RETURNING  [new]
Алекссс
Member

Откуда:
Сообщений: 1931
--Eugene--,

execute immediate 'delete from ' || table_name || ' returning b into :1' RETURNING bulk collect into x;
7 фев 19, 14:30    [21803533]     Ответить | Цитировать Сообщить модератору
 Re: Dynamic DML with RETURNING  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17095
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> 
7 фев 19, 14:33    [21803536]     Ответить | Цитировать Сообщить модератору
 Re: Dynamic DML with RETURNING  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2091
вот он, нужный синтаксис:
execute immediate 'delete t returning b into :x' returning bulk collect into x
однако, довольно странно - внутри просто RETURNING, а снаружи RETURNING BULK COLLECT.
а я-то думал, что RETURNING - это для одной строки, а RETURNING BULK COLLECT - для нескольких
7 фев 19, 15:02    [21803575]     Ответить | Цитировать Сообщить модератору
 Re: Dynamic DML with RETURNING  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17095
--Eugene--
а я-то думал, что RETURNING - это для одной строки, а RETURNING BULK COLLECT - для нескольких

Bulk collect - это PL/SQL.
7 фев 19, 15:04    [21803578]     Ответить | Цитировать Сообщить модератору
 Re: Dynamic DML with RETURNING  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2091
andrey_anonymous,

да понял я
понял
7 фев 19, 15:15    [21803590]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить