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