我正在尝试在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
?
答案 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