2015-05-15 26 views
1

我試圖將DBMS_METADATA.GET_DDL的輸出設置爲SQLPlus中的我的RET_VAR綁定變量。SP2-1504:無法打印未初始化的LOB變量

我嘗試以下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"

我也試過圍繞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運行它,我得到這個錯誤:

ERROR at line 5: ORA-06550: line 5, column 1: PLS-00103: Encountered the symbol "SPOOL"

我如何分配的DBMS_METADATA.GET_DDL輸出到我的RET_VAR

+2

我首先看到的 - 在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