使用oracle中的变量作为插入命令oracle的表名

时间:2018-10-31 15:46:50

标签: sql oracle select procedure

尝试创建一个过程,该过程将插入或更新其名称存储在另一个表中的某个表,并提供更多信息。

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;

所以我将尝试解释我的最终目标,我想通过我的cursor1,当我找到一个通过验证的表时,便进入了我的cursor2。在我的第二个循环中,我将要验证cursor1上是否有一个与表相关联的表(未实现),然后如果我发现一个不相关联的表,则需要创建一个与原始表相同的字段(这就是为什么我试图将表名保存在变量中的原因。如果它存在并且其dt_fim(date end)为null,那么我需要将cursor1(n_tab)中表中的所有数据插入到cursor2(n_tab2)中表中。

我将尝试进一步解释任何疑问,它仍然让我感到困惑,只是开始。

感谢您的任何建议/帮助。

2 个答案:

答案 0 :(得分:1)

尝试在下面的块中将表名作为变量传递:

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;

答案 1 :(得分:1)

这是正确的语法,但不建议用于如此简单的操作

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

因为最好(并且更安全)在插入中明确指定列名,如果要动态地执行此操作,则需要额外的块。

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

顺便问一下,为什么要将表名放在变量中而不是直接插入?