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

Sql 使用oracle中的变量作为插入命令oracle的表名,sql,oracle,select,procedure,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_c

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

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;
创建或替换程序LIMPAR\u TAB\u proc
--stmt VARCHAR2(1000);
n_tab sii_bck_cfg_tab.nome_tab%类型;
前缀sii_bck_cfg_tab.pref_tab_bck%类型;
max_reg sii_bck_cfg_选项卡。max_reg_bck%类型;
id_fk sii_bck_cfg_选项卡。id_bck_cfg_选项卡%类型;
n_tab2 sii_bck_tab.名称选项卡%类型;
睾丸VARCHAR2(500);
光标c1为
从中选择ID_BCK_CFG_选项卡、Nome_选项卡、pref_选项卡、max_reg_BCK
sii_bck_cfg_选项卡,其中desativado_em为空或desativado_em0由criado_em排序;
光标c2为
从中选择sii_bck_tab.ID_bck_CFG_tab、sii_bck_tab.nome_tab
sii_bck_选项卡,sii_bck_cfg_选项卡,其中
sii_bck_cfg_tab.id_bck_cfg_tab=sii_bck_tab.id_bck_cfg_tab和dt_fecho是
无效的
开始
开c1;
环
将c1提取到id_fk,n_选项卡,前缀,max_reg;
未找到c1%时退出;
DBMS|u OUTPUT.PUT|u LINE('Nome Tabela='| | id|u fk | | | | n|u tab | | |前缀
||“| | max|u reg);
开放c2;
环
将c2提取到id_fk,n_tab2中;
未找到c2%时退出;
DBMS|u OUTPUT.PUT|u LINE('chave aqui='| | id|u fk | n|u tab2);
如果找到c2%,则
测试项:='插入'| | n|选项卡2 | |'从'| | n|选项卡中选择*;
执行即时测试;
如果结束;
端环;
关闭c2;
端环;
关闭c1;
因此,我将尝试解释我的最终目标,我想通过游标1,当我找到一个通过验证的表时,我进入游标2。在第二个循环中,我想验证是否有一个表与游标1上的表关联(未实现),然后如果找到一个不关联的表,我需要创建一个与原始表相同字段的表(这就是为什么我试图将表名保存在变量中)。如果它存在且其dt_fim(日期结束)为空,则我需要将cursor1(n_选项卡)表中的所有数据插入cursor2(n_选项卡2)上的表中

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


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

尝试下面的程序块以将tablename作为变量传递:

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;

请尝试以下块以变量形式传递tablename:

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;

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

testes:= 'INSERT INTO ' || n_tab2 ||' SELECT * FROM ' || n_tab;
EXECUTE IMMEDIATE testes;
因为在insert中显式指定列名更可取(也更安全),如果要动态指定列名,则需要额外的块

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

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

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

testes:= 'INSERT INTO ' || n_tab2 ||' SELECT * FROM ' || n_tab;
EXECUTE IMMEDIATE testes;
因为在insert中显式指定列名更可取(也更安全),如果要动态指定列名,则需要额外的块

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

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

语句中需要值吗?我使用一个循环来获取我需要的名称,所以我真的不知道还有什么其他方法来完成这个过程,这就是为什么我尝试使用变量。@Sapo121:编辑您的问题,并向我们展示您试图实现的目标的全貌。我试着解释我的最终目标,但我仍然很遥远,这就是为什么我没有把所有的信息都放进去,我不知道我需要插入哪个表,所以我不知道需要插入多少列或哪些列have@Sapo121:看起来源表和目标表的名称来自另一个表的列,动态插入似乎是不可避免的,尽管我认为这是一个糟糕的设计。您可以继续使用我给您的选项1,除非源表和目标表之间存在列顺序不匹配,否则它将起作用,在这种情况下,您必须在最终查询中动态地引入列。此外,与open..fetch loops相比,我更喜欢隐式游标for循环。我需要语句中的值吗?我使用一个循环来获取我需要的名称,所以我真的不知道还有什么其他方法来完成这个过程,这就是为什么我尝试使用变量。@Sapo121:编辑您的问题,并向我们展示您试图实现的目标的全貌。我试着解释我的最终目标,但我仍然很遥远,这就是为什么我没有把所有的信息都放进去,我不知道我需要插入哪个表,所以我不知道需要插入多少列或哪些列have@Sapo121:看起来源表和目标表的名称来自另一个表的列,动态插入似乎是不可避免的,尽管我认为这是一个糟糕的设计。您可以继续使用我给您的选项1,除非源表和目标表之间存在列顺序不匹配,否则它将起作用,在这种情况下,您必须在最终查询中动态地引入列。此外,对于循环,更喜欢隐式游标,而不是开放获取循环。