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

时间:2015-05-15 20:54:25

标签: oracle sqlplus

我正在尝试在SQLPlus中将DBMS_METADATA.GET_DDL的输出设置为我的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:无法打印未初始化的LOB变量“RET_VAL”

我还尝试使用RET_VAL / BEGIN块围绕END的分配:

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

1 个答案:

答案 0 :(得分: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