定义变量以便在PL / SQL匿名块中重复使用

时间:2015-02-02 22:25:09

标签: oracle plsql oracle-sqldeveloper

我正在使用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"期待以下之一:..."

有人可以解释一下我做错了什么。

1 个答案:

答案 0 :(得分: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 Name',无论如何这都是无效的名称,除非您将其视为带引号的标识符 - 并且最好不要这样做。但是如果你必须,或者正在四处寻找它们是如何工作的,那么记住这个案例也是固定的,并且每一个引用都必须相同并引用。如果你试图删除(然后重新创建?)一个名称中有空格的表,你需要用双引号包装该值:

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

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

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