2015-07-02 2 views
0

Я пытаюсь выполнить процедуру из сценария оболочки и заканчивая ошибкой:PLS-00103 ошибка при выполнении процедуры

Пожалуйста, помогите мне в этом:

сообщение
default_shipment_date() 
{ 
log_writer "$pgm_name" "[INFO] $pgm_name - In default_shipment_date Function" 
sqlplus -S $CTGAUTH_LOGIN/[email protected]$CTGAUTH_TNSNAMES <<-EOF >> $LOG_DIR/${pgm_name}_${TODAY}.log 2> $LOG_DIR/${pgm_name}_${TODAY}.err 

SET SERVEROUTPUT ON 
BEGIN 
    EXECUTE DEFAULT_SHIPMENT_DATE(); 
END; 
/

exit 
EOF 
log_writer "$pgm_name" "[INFO] $pgm_name - Exiting default_shipment_date Function" 
} 

Ошибка показано ниже :

Thu Jul 2 03:24:39 EDT 2015) - [INFO] ctg_new_prds - In default_shipment_date Function 
EXECUTE DEFAULT_SHIPMENT_DATE(); 
     * 
ERROR at line 2: 
ORA-06550: line 2, column 9: 
PLS-00103: Encountered the symbol "DEFAULT_SHIPMENT_DATE" when expecting one of 
the following: 
:= . (@ % ; immediate 
The symbol ":=" was substituted for "DEFAULT_SHIPMENT_DATE" to continue. 

ответ

1

Вам не нужно использовать инструкцию «EXECUTE» в PL/SQL.

Если вам нужно использовать PL/SQL (включая переключение контекста из SQL), то ваш код должен выглядеть следующим образом:

default_shipment_date() 
{ 
log_writer "$pgm_name" "[INFO] $pgm_name - In default_shipment_date Function" 
sqlplus -S $CTGAUTH_LOGIN/[email protected]$CTGAUTH_TNSNAMES <<-EOF >> $LOG_DIR/${pgm_name}_${TODAY}.log 2> $LOG_DIR/${pgm_name}_${TODAY}.err 

SET SERVEROUTPUT ON 
BEGIN 
    DEFAULT_SHIPMENT_DATE(); 
END; 
/

exit 
EOF 
log_writer "$pgm_name" "[INFO] $pgm_name - Exiting default_shipment_date Function" 
} 

Однако, почему переключение в PL/SQL на всех, просто выполнить процедуру в вашей среде SQL:

default_shipment_date() 
{ 
log_writer "$pgm_name" "[INFO] $pgm_name - In default_shipment_date Function" 
sqlplus -S $CTGAUTH_LOGIN/[email protected]$CTGAUTH_TNSNAMES <<-EOF >> $LOG_DIR/${pgm_name}_${TODAY}.log 2> $LOG_DIR/${pgm_name}_${TODAY}.err 

SET SERVEROUTPUT ON 
EXECUTE DEFAULT_SHIPMENT_DATE(); 

exit 
EOF 
log_writer "$pgm_name" "[INFO] $pgm_name - Exiting default_shipment_date Function" 
} 

NB Это предполагает сценарий оболочек все правильно и т.д.

Надеются, что это помогает, Олли

+1

'execute' просто SQL \ * Plus стенографии для анонимного блока в любом случае; он завершает команду в 'begin' /' end', что вы можете увидеть, если вы попытаетесь выполнить что-то недействительное. Таким образом, вы не препятствуете переключению контекста. –

+0

Да, ты прав Алекс. Я не думал должным образом, должен попытаться прекратить слишком много думать сразу :-) Спасибо, что указали это. – Ollie

+1

Полагаю, вы, наверное, знали, что на самом деле * 8-) Я был гонг, чтобы сказать, что они взаимозаменяемы; но это не совсем так; 'execute' не заменяет командный буфер SQL \ * Plus, который иногда может быть удобным. –

Смежные вопросы