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

Defining variable for repeated use in PL/SQL anonymous blocks

我正在使用 Oracle SQL 开发人员。

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

我没有创建过程或函数的权限,所以我不得不反复调用匿名块。

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

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: Encountered the symbol "TABLE" 当期望出现以下情况之一时:..."

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

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

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,但对于这种用法,替换可能更简单。

当然,您可以 运行 静态地删除命令 SQL,但我猜您想隐藏 table-not-found 错误。


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

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

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

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