定义变量以在 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"';
我正在使用 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"';