我正在尝试运行以下匿名阻止,但收到错误ORA-00900: invalid SQL statement
。我知道在Oracle的PL / SQL块中不可能将DDL作为静态SQL发布。由于我有超过50个需要在匿名块中执行的sql脚本,因此无法对每个sql语句发出EXECUTE IMMEDIATE
。这就是为什么我创建单独的脚本作为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;
答案 0 :(得分:2)
其他
@ UpgradeFromV2.1ToV3.0.sql;
结束if;
您无法直接在 PL / SQL块中调用sql脚本。你需要从外部调用它。
我建议将 sql脚本的完整内容放在PL / SQL块中。
请勿在 PL / SQL 和 SQL * Plus 之间混淆。
PL / SQL 是一种服务器端语言,包括 P rocedural L anguage(PL)和 S < / strong> tructured Q uery L anguage(SQL)。它在Oracle服务器进程内执行。
SQL * Plus 是 C ommand L ine I 接口(CLI)工具允许您将SQL和PL / SQL代码提交给Oracle服务器以供执行。
更新 OP似乎提出了类似的问题here。这个问题与上一个问题有关。
您可以使用 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