在Oracle过程中将架构名称引用为变量
有没有办法在oracle过程中将架构名称设置为变量 创建或替换程序测试失败 v_模式varchar2(30) 开始 插入v_schema.tab_a(a,b) 从xyz中选择(a,b) 结束; /在Oracle过程中将架构名称引用为变量,oracle,variables,schema,Oracle,Variables,Schema,有没有办法在oracle过程中将架构名称设置为变量 创建或替换程序测试失败 v_模式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 ||
谢谢您需要使用动态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是您想要重新考虑这个问题的答案仅使用动态sql:执行立即“插入到”|| v|u schema.tab_a…”;谢谢insert语句的问题是它们太长,并且带有引号和(etcc.),这是调试的噩梦。有没有办法使partial语句的意思是v|U sql:=“insert into | v| U schema | | | | string|1”;我尝试过这个方法,但出现了错误。@RMAN-抱歉,我不理解什么是“partial语句”是在此上下文中。您希望将语句放入局部变量的原因之一是,如果您尝试动态生成任意长度的语句,则可以调试不可避免的语法错误。您可以(并且应该)尽可能地使用绑定变量以避免转义字符串。使用q引号语法也会使您受益匪浅,即
v_sql:=q'{insert into foo(a,b)选择'bar',baz'from dual}'
而不是尝试正确转义每个引号。