无法在 Oracle 匿名块中调用和执行 .sql 脚本文件
cant call and execute .sql script file in Oracle anonymous block
我正在尝试 运行 下面的匿名块,但出现错误 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;
else
@UpgradeFromV2.1ToV3.0.sql;
end if;
您不能在 PL/SQL 块 中直接调用 sql 脚本。需要外部调用。
我建议,将 sql 脚本 的整个 content 放在 PL/SQL 块中。
不要混淆 PL/SQL 和 SQL*Plus.
PL/SQL 是一种服务器端语言,其中包括 P 过程 L 语言(PL)和S结构Q查询L语言(SQL).它在 Oracle 服务器进程中执行。
SQL*Plus 是一个 C 命令和 Line Interface(CLI) 工具,允许您提交 SQL 和 PL/SQL 代码到 Oracle 服务器执行。
Update OP 好像问过类似的问题here。而且这个问题和上一个问题有关系。
您可以使用 DBMS_SCHEDULER 并将这些 sql 脚本作为各自的 工作 提交。
调用 sql 脚本取决于您的 OS.
例如,在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
我正在尝试 运行 下面的匿名块,但出现错误 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;
else
@UpgradeFromV2.1ToV3.0.sql;
end if;
您不能在 PL/SQL 块 中直接调用 sql 脚本。需要外部调用。
我建议,将 sql 脚本 的整个 content 放在 PL/SQL 块中。
不要混淆 PL/SQL 和 SQL*Plus.
PL/SQL 是一种服务器端语言,其中包括 P 过程 L 语言(PL)和S结构Q查询L语言(SQL).它在 Oracle 服务器进程中执行。
SQL*Plus 是一个 C 命令和 Line Interface(CLI) 工具,允许您提交 SQL 和 PL/SQL 代码到 Oracle 服务器执行。
Update OP 好像问过类似的问题here。而且这个问题和上一个问题有关系。
您可以使用 DBMS_SCHEDULER 并将这些 sql 脚本作为各自的 工作 提交。
调用 sql 脚本取决于您的 OS.
例如,在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