【问题标题】:Referencing Schema Name as Variable in Oracle Procedure在 Oracle 过程中将模式名称作为变量引用
【发布时间】: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 variables schema


【解决方案1】:

您需要使用动态 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 就是您想要重新考虑该问题的答案。

【讨论】:

  • 谢谢。插入语句的问题是它们太长并且有引号和 ( 等。这是调试的噩梦。有没有办法使部分语句表示 v_sql :='insert into || v_schema || 'string_1'; 我试过了,但出错了。
  • @RMAN - 抱歉,我不明白在这种情况下“部分陈述”是什么。要将语句放在局部变量中的原因之一是,如果您尝试动态生成任意长度的语句,则可以调试不可避免的语法错误。您可以(并且应该)尽可能使用绑定变量以避免转义字符串。您还可以从使用 q 引用语法(即v_sql := q'{insert into foo( a, b ) select 'bar', 'baz' from dual}')中受益,而不是尝试正确转义每个单引号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
相关资源
最近更新 更多