не могу вызвать и выполнить файл сценария .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;

person Andrew    schedule 07.08.2015    source источник


Ответы (1)


еще

@UpgradeFromV2.1ToV3.0.sql;

закончить, если;

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

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

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

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

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

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

Вы можете использовать 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 
person Lalit Kumar B    schedule 07.08.2015
comment
в моем предыдущем вопросе я поместил весь свой sql-скрипт в блок PL/SQL, но он не работает, так как я должен использовать EXECUTE IMMEDIATE для каждого оператора DDL. Невозможно выдать DDL как статический SQL в блоке PL/SQL в Oracle - person Andrew; 07.08.2015
comment
в моем предыдущем вопросе Какой вопрос? Вы не упомянули об этом в своем текущем вопросе. Опубликуйте детали sql-скрипта. - person Lalit Kumar B; 07.08.2015
comment
вопрос был помечен как дубликат и был закрыт, но вы можете увидеть здесь stackoverflow.com/questions/31872132/ - person Andrew; 07.08.2015
comment
Хорошо, но для меня это выглядит сложно, мне нужно больше узнать об этом. Но спасибо, теперь я знаю, что невозможно вызвать такой файл сценария в блоке pl sql :) - person Andrew; 07.08.2015
comment
@Rahul Вам нужно либо поместить скрипт в блок, либо выполнить несколько сложных шагов, как я показал выше. Невозможно прочитать файл ОС напрямую из PL/SQL. Удачи!. - person Lalit Kumar B; 07.08.2015