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

Откуда: Санкт-Петербург
Сообщений: 1018
Можно ли как то совместить простой селект с динамическим sql?

Например так:

select t.id,
         t.name,
         (EXECUTE IMMEDIATE 'select t2.note from ' || t.table_name || ' where ' || t.table_key || ' = ' t.link_id)) as note
from tbl t


Oracle выдаёт ошибку, т.к. так нельзя. А как можно?

использую Oracle 11
6 авг 14, 21:49    [16408917]     Ответить | Цитировать Сообщить модератору
 Re: динамический sql в запросе  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10760
Вынести execute immediate "за скобки".
6 авг 14, 21:51    [16408924]     Ответить | Цитировать Сообщить модератору
 Re: динамический sql в запросе  [new]
verter
Member

Откуда: Санкт-Петербург
Сообщений: 1018
Basil A. Sidorov,

не работает, можете точно написать как?
6 авг 14, 22:02    [16408962]     Ответить | Цитировать Сообщить модератору
 Re: динамический sql в запросе  [new]
ora601
Guest
verter,
Сделать pipelined функцию как один из вариантов.
6 авг 14, 22:02    [16408963]     Ответить | Цитировать Сообщить модератору
 Re: динамический sql в запросе  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
Напиши pl/SQL функцию и вызывай её
6 авг 14, 22:04    [16408969]     Ответить | Цитировать Сообщить модератору
 Re: динамический sql в запросе  [new]
verter
Member

Откуда: Санкт-Петербург
Сообщений: 1018
andreymx
Напиши pl/SQL функцию и вызывай её


Понял. Спасибо!
6 авг 14, 22:08    [16408979]     Ответить | Цитировать Сообщить модератору
 Re: динамический sql в запросе  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54381
verter
andreymx
Напиши pl/SQL функцию и вызывай её


Понял. Спасибо!
про бинды не забудь
6 авг 14, 22:25    [16409022]     Ответить | Цитировать Сообщить модератору
 Re: динамический sql в запросе  [new]
init.ora
Member

Откуда: гетто
Сообщений: 317
>>Можно ли как то совместить простой селект с динамическим sql?
Можно:
select t.table_name, rownum rn,
extractvalue(dbms_xmlgen.getXMLType('select count(1)cnt from dual where rownum<='||rownum),'/ROWSET/ROW/CNT/.') cnt
from user_tables t 
where rownum<=10 


но лучше так не делать :D
6 авг 14, 22:32    [16409045]     Ответить | Цитировать Сообщить модератору
 Re: динамический sql в запросе  [new]
verter
Member

Откуда: Санкт-Петербург
Сообщений: 1018
init.ora
>>Можно ли как то совместить простой селект с динамическим sql?
Можно:
select t.table_name, rownum rn,
extractvalue(dbms_xmlgen.getXMLType('select count(1)cnt from dual where rownum<='||rownum),'/ROWSET/ROW/CNT/.') cnt
from user_tables t 
where rownum<=10 


но лучше так не делать :D


Круто! Работает. А очему лучше так не делать?
6 авг 14, 22:54    [16409139]     Ответить | Цитировать Сообщить модератору
 Re: динамический sql в запросе  [new]
init.ora
Member

Откуда: гетто
Сообщений: 317
--test table
create table dsql_test
as
select level as id
from dual
connect by level<=20;

--test query
select t.*,
extractvalue(dbms_xmlgen.getXMLType('select count(1)cnt from dsql_test where id <='||id),'/ROWSET/ROW/CNT/.') cnt
from dsql_test t 
where rownum<=10 


как уже сказал andreymx, "про бинды не забудь":

SQL> select sql_text
  2  from v$sql
  3  where sql_text like 'select count(1)cnt from dsql_test%'

SQL_TEXT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
-------------------------------------------------------- 
select count(1)cnt from dsql_test where id <=4                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
select count(1)cnt from dsql_test where id <=10                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
select count(1)cnt from dsql_test where id <=9                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
select count(1)cnt from dsql_test where id <=3                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
select count(1)cnt from dsql_test where id <=6                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
select count(1)cnt from dsql_test where id <=5                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
select count(1)cnt from dsql_test where id <=2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
select count(1)cnt from dsql_test where id <=8                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
select count(1)cnt from dsql_test where id <=1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
select count(1)cnt from dsql_test where id <=7  
6 авг 14, 23:22    [16409241]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить