Как мы передаем полный SQL-запрос из таблицы в оператор вставки в PL / SQL, используя команду «немедленное выполнение» - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь использовать SQL-запросы, хранящиеся в таблице, в инструкции вставки внутри процедуры.

Ниже приведена таблица операторов,

STMT_ID STATMENT1                                              STATEMENT2
S001     INSERT INTO TABLE1 (S_ID, REQUEST_NUM,CASE_ID,C1,C2)   select min(s_id) s_id, REQUEST_NUM, CASE_ID, trim(c1),
                                                                ABS(max(case when source = 'S1' then  c2 end) +
                                                                max(case when source = 'S2' then -c2 end))
                                                                from TABLE2 where REQUEST_NUM =REQUEST_IN 
                                                                group by  REQUEST_NUM , CASE_ID, trim(c1)
                                                                order by S_ID    

Ниже приведен блок процедуры,

 execute immediate 'select '||STATEMENT1||'+'||STATEMENT2||'   FROM statement_table where stmt_id='S001';

Результат, который я пытаюсь получить, равен:

INSERT INTO TABLE1 (S_ID, REQUEST_NUM,CASE_ID,C1,C2)    
 select min(s_id) s_id, REQUEST_NUM, CASE_ID, trim(c1),
 ABS(max(case when source = 'S1' then  c2 end) +
 max(case when source = 'S2' then -c2 end))
 from TABLE2 where REQUEST_NUM =REQUEST_IN 
 group by  REQUEST_NUM , CASE_ID, trim(c1)
 order by S_ID    

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 22 января 2019

Вот как.

Во-первых, ваши (на самом деле, мои ) заявления. Я собираюсь вставить строку в таблицу Скотта DEPT.

SQL> select * from test;

        ID
----------
ST1
--------------------------------------------------------------------------------
ST2
--------------------------------------------------------------------------------
         1
insert into dept (deptno, dname, loc)
select max(deptno) + 1, 'stack', 'zoom' from dept order by 1


SQL> select * From dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
         1 x              y

Код; DBMS_OUTPUT используется для проверки правильности утверждения.

SQL> set serveroutput on
SQL> declare
  2    l_st1 test.st1%type;
  3    l_st2 test.st2%type;
  4    l_str varchar2(1000);
  5  begin
  6    select st1, st2
  7      into l_st1, l_st2
  8      from test
  9      where id = 1;
 10
 11    l_str := l_st1 ||' '|| l_st2;
 12    dbms_output.put_line(l_str);
 13    execute immediate l_str;
 14  end;
 15  /
insert into dept (deptno, dname, loc) select max(deptno) + 1, 'stack', 'zoom'
from dept order by 1

PL/SQL procedure successfully completed.

Результат:

SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        41 stack          zoom        --> this was inserted
         1 x              y

6 rows selected.

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...