Использование переменных в oracle в качестве имен таблиц для команды вставки oracle - PullRequest
0 голосов
/ 31 октября 2018

Попытка создать процедуру, которая будет либо вставлять, либо обновлять определенную таблицу, если ее имя хранится в другой таблице с дополнительной информацией.

CREATE OR REPLACE PROCEDURE LIMPAR_TAB_proc IS

--stmt VARCHAR2(1000);
n_tab sii_bck_cfg_tab.nome_tab%type;
prefix sii_bck_cfg_tab.pref_tab_bck%type;
max_reg sii_bck_cfg_tab.max_reg_bck%type;
id_fk sii_bck_cfg_tab.id_bck_cfg_tab%type;
n_tab2 sii_bck_tab.nome_tab%type;
testes VARCHAR2(500);

CURSOR c1 IS
SELECT ID_BCK_CFG_TAB,Nome_tab, pref_tab_bck, max_reg_bck FROM 
sii_bck_cfg_tab WHERE desativado_em IS NULL OR desativado_em<=SYSDATE AND 
n_dias_reten>0 ORDER BY criado_em; 

CURSOR c2 IS 
SELECT sii_bck_tab.ID_BCK_CFG_TAB , sii_bck_tab.nome_tab from 
sii_bck_tab,sii_bck_cfg_tab WHERE 
sii_bck_cfg_tab.id_bck_cfg_tab=sii_bck_tab.id_bck_cfg_tab and dt_fecho is 
NULL ;

BEGIN                                  

OPEN c1;

LOOP
FETCH c1 INTO id_fk,n_tab,prefix,max_reg;
EXIT WHEN c1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Nome Tabela = ' || id_fk ||' '|| n_tab ||' '|| prefix 
||' '|| max_reg); 
    OPEN c2;
      LOOP 
         FETCH c2 INTO id_fk, n_tab2;
         EXIT WHEN c2%NOTFOUND;
         DBMS_OUTPUT.PUT_LINE('chave aqui = ' || id_fk || n_tab2);
         IF c2%FOUND THEN

         testes:= 'INSERT INTO ' || n_tab2 || 'select * from ' || n_tab;
         EXECUTE IMMEDIATE testes;
         END IF;  
      END LOOP;
      CLOSE c2;

END LOOP;
CLOSE c1;

поэтому я попытаюсь объяснить свою конечную цель, я хочу пройти через мой курсор1, и когда я найду таблицу, которая проходит проверку, я пойду в свой курсор2. Во время моего второго цикла я захочу проверить, есть ли таблица, связанная с таблицей, на моем cursor1 (не реализовано), а затем, если я найду таблицу, которая не связана, мне нужно будет создать таблицу с теми же полями, что и у оригинала (который Вот почему я пытаюсь сохранить имена таблиц в переменной). Если он существует и его dt_fim (конец даты) равен нулю, тогда мне нужно будет вставить все данные из таблицы курсора1 (n_tab) в таблицу, найденную на курсоре 2 (n_tab2).

Я попытаюсь объяснить любые сомнения дальше, это все еще смущает меня, только начинаю.

Спасибо за любой совет / помощь.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Это правильный синтаксис, но не рекомендуется для такой простой операции

testes:= 'INSERT INTO ' || n_tab2 ||' SELECT * FROM ' || n_tab;
EXECUTE IMMEDIATE testes;

Потому что предпочтительно (и безопаснее) явно указывать имена столбцов во вставке, для которых вам нужны дополнительные блоки, если вы хотите сделать это динамически.

INSERT INTO tab2(col1,col2,col3)  SELECT col1,col2,col3 FROM tab;

Кстати, есть ли причина, по которой вы помещаете имена таблиц в переменные вместо прямой вставки?

0 голосов
/ 31 октября 2018

Попробуйте этот блок ниже, чтобы передать имя таблицы в качестве переменных:

declare
table_1 varchar2(10):='N_tab';
table_2 varchar2(10):='N_tab2';
test varchar2(1000);
begin

test:= 'INSERT all into ' || table_2 || ' SELECT * FROM ' ||table_1;
EXECUTE IMMEDIATE test;
dbms_output.put_line (test);

end;
...