SP2-1504:无法打印未初始化的 LOB 变量

SP2-1504: Cannot print uninitialized LOB variable

我正在尝试将 DBMS_METADATA.GET_DDL 的输出设置为我在 SQLPlus 中的 RET_VAR 绑定变量。

我尝试了以下 script.sql

set pagesize 0
SET LONG 9999999
VARIABLE ret_val CLOB
VARIABLE lengthRet NUMBER

select DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE') into :ret_val from dual;

spool testClean.sql

print :ret_val;

spool off
/ -- I had to add this line because the script would never run otherwise

但我得到:

SP2-1504: Cannot print uninitialized LOB variable "RET_VAL"

我还尝试用 BEGIN/END 块包围 RET_VAL 的赋值:

set pagesize 0
SET LONG 9999999
VARIABLE ret_val CLOB
VARIABLE lengthRet NUMBER

BEGIN
select DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE') into :ret_val from dual;
END;

spool testClean.sql

print :ret_val;
spool off
/

但是,当我尝试在 SQLPlus 中 运行 它时,我得到了这个错误:

ERROR at line 5: ORA-06550: line 5, column 1: PLS-00103: Encountered the symbol "SPOOL"

如何将 DBMS_METADATA.GET_DDL 的输出分配给 RET_VAR

在您发布的第一个代码中,您试图在普通 SQL 中使用 select ... into 模式,但它只能在 PL/SQL 上下文中使用。所以你使用块来填充绑定变量是正确的。

正如@JanisBaiza 所说,您需要在匿名块后添加一个 /;但不在脚本末尾:

set pagesize 0
SET LONG 9999999
VARIABLE ret_val CLOB

BEGIN
  select DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE') into :ret_val from dual;
END;
/

您可以直接调用该函数,使用 select ... from dual:

BEGIN
  :ret_val := DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE');
END;
/

或者您可以使用 execute shorthand 作为单行匿名块:

exec :ret_val := DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE');

你为什么为此使用绑定变量并不明显,因为你可以从普通 SQL 调用函数(没有 into 子句!):

set pagesize 0
SET LONG 9999999

spool testClean.sql
select DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE') from dual;
spool off