【发布时间】:2020-06-29 22:54:27
【问题描述】:
有没有办法在 oracle 过程中将模式名称设置为变量?
创建或替换程序测试是 v_schema varchar2(30);
开始
插入 v_schema.tab_a (a, b) 从 xyz 中选择 (a, b);
结束; /
谢谢
【问题讨论】:
-
只使用动态sql:立即执行'insert into '||v_schema'.tab_a.....';
有没有办法在 oracle 过程中将模式名称设置为变量?
创建或替换程序测试是 v_schema varchar2(30);
开始
插入 v_schema.tab_a (a, b) 从 xyz 中选择 (a, b);
结束; /
谢谢
【问题讨论】:
您需要使用动态 SQL
create or replace procedure test
is
v_schema varchar2(30);
v_sql varchar2(1000);
begin
v_sql := 'insert into ' || v_schema || '.tab_a( a, b ) ' ||
'select a, b from xyz';
dbms_output.put_line( 'About to execute the statement ' || v_sql );
execute immediate v_sql;
end;
几点
xyz 中的所有行插入到名为 tab_a 的表中,但您不知道该表在哪个模式中,这是一个危险信号。这是不寻常的,通常表明您的设计存在问题。当您需要额外的灵活性时,非常非常偶尔动态 SQL 是一个很好的工具。但通常情况下,当您考虑某个问题时,动态 SQL 就是您想要重新考虑该问题的答案。【讨论】:
v_sql := q'{insert into foo( a, b ) select 'bar', 'baz' from dual}')中受益,而不是尝试正确转义每个单引号。