代码之家  ›  专栏  ›  技术社区  ›  Gern Blanston

如何使用oracle脚本中的变量作为表名

  •  15
  • Gern Blanston  · 技术社区  · 15 年前

    我有一个pl\sql脚本,我想将脚本中使用的表名设置为一个变量。所以,根据我在网上找到的一些例子,我写了下面的代码。第一部分是有效的,所以我认为我的一般语法是正确的,但是第二部分,我尝试使用一个变量作为表名,它会出错(“ SQL错误:ORA-00903:表名无效

    --works
    variable numOfrecords number;
    exec :numOfrecords := 10;
    select * from customers2008 where rownum < :numOfrecords;
    
    --does not work
     variable tableNm CHAR;
     exec :tableNm := 'customers2008';
     print tableNm;
     select * from :tableNm;
    
    4 回复  |  直到 15 年前
        1
  •  15
  •   Steve Broberg    15 年前

    如果您是从sqlplus运行这个脚本(看起来是这样),您需要使用DEFINE命令,它允许您创建sqlplus子条件变量,这些变量只是直接的字符串替换,例如:

    define tableNm = 'customers2008'
    select * from &tableNm;
    

    看到了吗 Using Sql*Plus 有关如何使用这些的更多信息。可以使用预定义的位置子条件变量从命令行将值传递到脚本中,如下所示:

    define tableNm = &1
    select * from &tableNm;
    

    ... 然后像这样调用sqlplus:

    sqlplus user/pwd@server @myscript.sql customers2008
    

    关于bind和substitution变量之间的区别,请参见下面Dave Costa的答案。

        2
  •  8
  •   Dave Costa    15 年前

    您尝试使用的方法称为 绑定变量

    为了解析SQL语句,必须知道所涉及的表名和列名。因此表名不能用绑定变量表示,因为在解析时该值是未知的。

    如果您只是通过SQLPlus执行SQL和内联PL/SQL,那么替换变量是处理这个问题的一种简单方法,Steve解释道。当SQLPlus客户机读取命令时,甚至在将其发送到Oracle进行解析之前,替换变量将被替换为其值。

        3
  •  7
  •   CrashCodes    15 年前

    EXECUTE IMMEDIATE 'select * from' || tableNm;
    

    这是因为Oracle不允许为表(或任何其他对象名)绑定变量。

    executeimmediate方法有着重要的安全含义:当tableNm值由用户提供时,您对 SQL injection

        4
  •  6
  •   Eddie Awad    15 年前

    Substitution variables 工作:

    SQL> select * from &table_name;
    Enter value for table_name: dual
    old   1: select * from &table_name
    new   1: select * from dual
    
    D
    -
    X