Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle过程中将架构名称引用为变量_Oracle_Variables_Schema - Fatal编程技术网

在Oracle过程中将架构名称引用为变量

在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 ||

有没有办法在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 || '.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; 
几点

  • 几乎可以肯定的是,您希望在本地变量中构建SQL语句,以便在执行之前打印和/或记录。否则,当出现语法错误时,调试就会困难得多
  • 首先,您几乎不想求助于动态SQL。您有一个过程,知道要将
    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}'
    而不是尝试正确转义每个引号。