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 变量的主要内容,如果未能解决你的问题,请参考以下文章