2015-05-15 9 views
1

Я пытаюсь установить вывод DBMS_METADATA.GET_DDL моей переменной привязки RET_VAR в SQLPlus.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;' block –

ответ

1

В первом коде, который вы опубликовали, вы пытаетесь использовать шаблон select ... into в простом SQL, но он работает только в контексте 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 
Смежные вопросы