首页 > 解决方案 > 在 Oracle 过程中将模式名称作为变量引用

问题描述

有没有办法在 oracle 过程中将模式名称设置为变量?

创建或替换过程测试是 v_schema varchar2(30);

开始

插入 v_schema.tab_a (a, b) 从 xyz 中选择 (a, b);

结尾; /

谢谢

标签: oraclevariablesschema

解决方案


您需要使用动态 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; 

几点

  1. 您几乎肯定希望在本地变量中构建 SQL 语句,您可以在执行之前打印和/或记录它。否则,当出现语法错误时,您将很难进行调试。
  2. 您几乎从一开始就不想求助于动态 SQL。您有一个过程,您知道要将所有行插入xyz到名为的表中tab_a,但您不知道该表所在的模式是一个危险信号。这是不寻常的,通常表明您的设计存在问题。当您需要额外的灵活性时,非常非常偶尔动态 SQL 是一个很好的工具。但是,当您考虑一个问题时,动态 SQL 往往是您想要重新考虑该问题的答案。

推荐阅读