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