【问题标题】:Defining variable for repeated use in PL/SQL anonymous blocks为在 PL/SQL 匿名块中重复使用定义变量
【发布时间】:2015-02-03 07:42:53
【问题描述】:

我正在使用 Oracle SQL Developer。

我有一个匿名块,如果表存在则删除它。

我没有创建过程或函数的权限,所以我必须重复调用匿名块。

为了简单起见,我想将所有受影响的表的名称存储在脚本开头的变量中,然后再引用适当的变量。

DEFINE v_InputTable = 'Table Name';

DECLARE
 InputTable VARCHAR2(80) := &v_InputTable;
BEGIN
 EXECUTE IMMEDIATE 'DROP TABLE ' || InputTable;
EXCEPTION
 WHEN OTHERS THEN
    IF SQLCODE != -942 THEN
       RAISE;
    END IF;
END;
/

当我尝试此操作时,我收到错误“PLS-00103:在预期以下之一时遇到符号“TABLE”:...”

谁能解释一下我做错了什么。

【问题讨论】:

    标签: oracle plsql oracle-sqldeveloper


    【解决方案1】:

    替换变量以相当简单的方式替换。您必须将对字符串的引用括在单引号内,它们会变成文字。而不是你所拥有的,那就是:

    DECLARE
     InputTable VARCHAR2(80) := '&v_InputTable';
    

    这里其实不需要PL/SQL变量,可以直接在动态语句中使用替换变量(还是在引号内):

    DEFINE v_InputTable = 'Table Name';
    
    BEGIN
     EXECUTE IMMEDIATE 'DROP TABLE &v_InputTable';
    EXCEPTION
     WHEN OTHERS THEN
        IF SQLCODE != -942 THEN
           RAISE;
        END IF;
    END;
    /
    

    您也可以使用variable 命令定义绑定变量,而不是define,但对于这种用法,替换可能更简单。

    当然,您可以将 drop 命令作为普通 SQL 静态运行,但我猜您想隐藏 table-not-found 错误。


    该错误表明您定义的值实际上是字面上的'Table Name',除非您将其视为带引号的标识符,否则它无论如何都是无效的名称 - 而且最好不要这样做。但是,如果您必须,或者正在尝试看看它们是如何工作的,请记住案例也是固定的,并且对它的每个引用都必须相同并引用。如果您尝试删除(然后重新创建?)名称中包含空格的表,则需要将值括在双引号中:

    BEGIN
     EXECUTE IMMEDIATE 'DROP TABLE "&v_InputTable"';
    

    ...或者如果您想要一个单独的变量并连接动态语句:

    DECLARE
     InputTable VARCHAR2(80) := '"&v_InputTable"';
    

    【讨论】:

      猜你喜欢
      • 2014-07-18
      • 1970-01-01
      • 2014-09-30
      • 2013-11-07
      • 2017-01-29
      • 2015-08-25
      • 2017-09-02
      • 1970-01-01
      • 2013-10-24
      相关资源
      最近更新 更多