Как использовать динамическую таблицу каждого месяца в операторе вставки, когда одно статическое значение мы передаем в одном столбце - PullRequest
0 голосов
/ 23 мая 2019

В одном сохраненном процессе я использовал оператор insert into, я объявляю одну переменную как v_tbl_name, которая является динамической. Я собираюсь использовать эту динамическую таблицу в блоке insert into, пока мы передаем одно статическое значение в один столбец, но получим ошибку. Вот пример кода -

declare
v_tbl_name varchar2(5) := NULL;
v_gen_tbl constant varchar2(50) := 'arch_tbl_mon';   --table name
v_sql varchar2(10000);

begin
 v_tbl_name := v_gen_tbl || '_' ||  TO_CHAR(SYSDATE, 'MON');
v_sql := 'insert into tbl                 --- another table going to insert
 (select ''abc'' as col1, ........
  from '||v_tbl_name||');'
execute immediate v_sql;
commit;
end;

Здесь 'abc' статическое значение в виде столбца. После выполнения вышеприведенного кода он генерирует ошибку типа Encountered the symbol "Execute".

1 Ответ

2 голосов
/ 23 мая 2019

Сделайте это следующим образом:

declare
v_tbl_name varchar2(5) := NULL;
v_gen_tbl constant varchar2(50) := 'arch_tbl_mon';   --table name
v_sql varchar2(1000);
begin
 v_tbl_name := v_gen_tbl || '_' ||  TO_CHAR(SYSDATE, 'MON');
 v_sql:= 'insert into tbl                 --- another table going to insert
  select 'abc' as col1, ........
  from  '||v_tbl_name;
  execute immediate v_sql;
  commit;
end;

Демо:

declare
v_tbl_name varchar2(5) := NULL;
v_gen_tbl constant varchar2(50) := 'arch_tbl_mon';   --table 
v_sql varchar2(1000);
begin

 v_tbl_name := 'DEPT';
 v_sql :='insert into tbl   select *  from '||v_tbl_name;
 execute immediate v_sql;  
end;

Exec:

SQL> select * from tbl;
     DEPTNO DNAME                LOC
     ---------- -------------------- --------------------
        1      XXX                 YYY

Редактировать:

Здесь статическое значение abc в виде столбца, поэтомуне в состоянии выполнить сохраненный процесс.Он генерирует ошибку типа «Обнаружен символ abc».

См. Демонстрационный пример ниже:

Таблица tbl заполняется статическим значением abc из оператора выбора:

SQL> select * from tbl;
    DEPTNO DNAME                LOC                  B
---------- -------------------- -------------------- ---

После выполнения:

 declare
    v_tbl_name varchar2(5) := NULL;
    v_gen_tbl constant varchar2(50) := 'arch_tbl_mon';   --table 
    v_sql varchar2(1000);
    begin

     v_tbl_name := 'DEPT';
     v_sql :='insert into tbl (deptno,dname,loc,b) select a.*, ''abc''  from '||v_tbl_name||' a'; 
     execute immediate v_sql;  
     Commit;
    end;

ВЫХОД

SQL> SELECT * FROM TBL;
    DEPTNO DNAME                LOC                  B
---------- -------------------- -------------------- ---
       100 Executive            USA                  abc

Окончательное редактирование:

Вы не выполнили то, что я показал вам, поэтому вы приземлилисьв проблему.Следуйте моим комментариям.Пожалуйста, замените имя столбца, где упомянуто, и оно будет решено.

declare
v_tbl_name varchar2(5) := NULL;
v_gen_tbl constant varchar2(50) := 'arch_tbl_mon';   --table name
v_sql varchar2(10000);

begin
 v_tbl_name := v_gen_tbl || '_' ||  TO_CHAR(SYSDATE, 'MON');
 v_sql := 'insert into tbl(col1,.....<all columns>)                 --- another table going to insert
  select ''abc'' as col1, a.col2........<other columns a.<columns>
  from '||v_tbl_name||' a';
execute immediate v_sql;
commit;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...