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

Posted

技术标签:

【中文标题】SP2-1504:无法打印未初始化的 LOB 变量【英文标题】:SP2-1504: Cannot print uninitialized LOB variable 【发布时间】:2015-05-15 20:54:25 【问题描述】:

我正在尝试将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

但我明白了:

“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 中运行它时,我得到了这个错误:

第 5 行出现错误:ORA-06550:第 5 行,第 1 列:PLS-00103:遇到符号“SPOOL”

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

【问题讨论】:

我看到的第一件事 - 在BEGIN ... END; 块之后需要/ 【参考方案1】:

在您发布的第一个代码中,您尝试在纯 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 简写单行匿名块:

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

【讨论】:

以上是关于SP2-1504:无法打印未初始化的 LOB 变量的主要内容,如果未能解决你的问题,请参考以下文章

为啥 cppcheck 工具找不到未初始化的变量?

多处理全局变量更新未返回给父级

数据库-Oracle如何将clob数据以字符串打印出来

C编译器如何处理使用未初始化的变量?

打印文件时却提示未安装打印机,是怎么回事

多次调用打印函数后未定义的行为