在 oracle 中使用变量作为插入命令 oracle 的 table 名称
Using variables in oracle as table names for insert command oracle
正在尝试创建一个过程来插入或更新某个 table 其名称存储在另一个 table 中并提供更多信息。
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;
所以我将尝试解释我的最终 objective,我想通过我的 cursor1,当我找到一个通过验证的 table 时,我会进入我的 cursor2。在我的第二个循环中,我将要验证是否有一个 table 与我的 cursor1 上的一个 table 相关联(未实现),然后如果我找到一个不相关的我将需要创建一个与原始字段相同(这就是为什么我试图将 table 名称保存在变量中的原因)。如果它存在并且它的 dt_fim(date end) 为 null 那么我将需要将来自 cursor1 (n_tab) 的 table 中的所有数据插入找到的 table在 cursor2(n_tab2).
有什么疑问我会尽量解释清楚的,我还是很困惑,刚开始。
感谢您的任何 advice/help。
试试下面的块将表名作为变量传递:
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 INTO tab2(col1,col2,col3) SELECT col1,col2,col3 FROM tab;
顺便问一下,为什么您将 table 名称放在变量中而不是直接插入?
正在尝试创建一个过程来插入或更新某个 table 其名称存储在另一个 table 中并提供更多信息。
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;
所以我将尝试解释我的最终 objective,我想通过我的 cursor1,当我找到一个通过验证的 table 时,我会进入我的 cursor2。在我的第二个循环中,我将要验证是否有一个 table 与我的 cursor1 上的一个 table 相关联(未实现),然后如果我找到一个不相关的我将需要创建一个与原始字段相同(这就是为什么我试图将 table 名称保存在变量中的原因)。如果它存在并且它的 dt_fim(date end) 为 null 那么我将需要将来自 cursor1 (n_tab) 的 table 中的所有数据插入找到的 table在 cursor2(n_tab2).
有什么疑问我会尽量解释清楚的,我还是很困惑,刚开始。
感谢您的任何 advice/help。
试试下面的块将表名作为变量传递:
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 INTO tab2(col1,col2,col3) SELECT col1,col2,col3 FROM tab;
顺便问一下,为什么您将 table 名称放在变量中而不是直接插入?