Не могу вызвать и выполнить файл сценария.sql в анонимном блоке Oracle

Я пытаюсь запустить приведенный ниже анонимный блок, но получаю сообщение об ошибке ORA-00900: invalid SQL statement, Я знаю, что невозможно выдать DDL как статический SQL в блоке PL/SQL в Oracle. Поскольку у меня есть более 50 сценариев sql, которые должны быть выполнены в анонимном блоке, невозможно выпустить EXECUTE IMMEDIATE с каждым оператором sql. Вот почему я создал отдельный скрипт в виде файла sql и пытаюсь позвонить из моего текущего анонимного блока.

  SET SERVEROUTPUT ON;
DECLARE MESSAGE VARCHAR2(100);
CHECK_VERSION VARCHAR2(100);
BEGIN
--- some code to check the version
select PROP_VAL into CHECK_VERSION from RATOR_MONITORING_CONFIGURATION.RM2_PROPERTIES WHERE PROP_NAME ='DB_VERSION';
  If CHECK_VERSION != 'V3.0' then
MESSAGE := 'Wrong Version';
-- IF(VERSION WRONG) THEN
-- MEESAGE := <<provide info for user here>>
else
@UpgradeFromV2.1ToV3.0.sql;
end if;
END;

1 ответ

Решение

еще

@UpgradeFromV2.1ToV3.0.sql;

конец если;

Вы не можете напрямую вызывать сценарий sql внутри блока PL/SQL. Вы должны внешне назвать это.

Я бы посоветовал поместить весь контент скрипта sql в блок PL/SQL.

Не путайте между PL/SQL и SQL * Plus.

  • PL/SQL - это язык на стороне сервера, который включает в себя языковой язык (PL) и язык структурированного языка (SQL). Он выполняется внутри процесса сервера Oracle.

  • SQL * Plus - это инструмент интерфейса пользователя (CLI), который позволяет передавать SQL и PL/SQL-код на сервер Oracle для выполнения.

Обновление ОП, похоже, задавало подобный вопрос здесь. И этот вопрос связан с предыдущим вопросом.

Вы можете использовать DBMS_SCHEDULER и отправить эти сценарии sql как соответствующие задания.

Вызов сценария sql зависит от вашей ОС.

Например, в Windows:

BEGIN  
  dbms_scheduler.create_job('MY_JOB',  
  job_action=>'C:\WINDOWS\SYSTEM32\CMD.EXE',  
  number_of_arguments=>3,  
  job_type=>'executable',  
  start_date => SYSTIMESTAMP,  
  repeat_interval => 'freq=hourly; byminute=0,30; bysecond=0;',  
  end_date => NULL,  
  enabled=> false);  
  dbms_scheduler.set_job_argument_value('MY_JOB',1,'/q');  
  dbms_scheduler.set_job_argument_value('MY_JOB',2,'/c');  
  dbms_scheduler.set_job_argument_value('MY_JOB',3,'D:\SCRIPTS\my_sql.bat');  
  dbms_scheduler.enable('MY_JOB');  
END;  
/  

Теперь ваш my_sql.bat будет выглядеть так:

sqlplus user@sid/password @D:\scripts\script.sql  
exit 
Другие вопросы по тегам