无法在 Oracle 匿名块中调用和执行 .sql 脚本文件

Posted

技术标签:

【中文标题】无法在 Oracle 匿名块中调用和执行 .sql 脚本文件【英文标题】:cant call and execute .sql script file in Oracle anonymous block 【发布时间】:2015-08-07 08:07:29 【问题描述】:

我正在尝试运行以下匿名块,但收到错误 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;

【问题讨论】:

【参考方案1】:

否则

@UpgradeFromV2.1ToV3.0.sql;

如果结束;

您不能直接调用 PL/SQL 块 内的 sql 脚本。你需要从外部调用它。

我建议,将 sql 脚本 的整个 内容 放在 PL/SQL 块中。

不要混淆 PL/SQLSQL*Plus

PL/SQL 是一种服务器端语言,包括 Procedural Language(PL) 和 S结构化Query L语言(SQL)。它在 Oracle 服务器进程中执行。

SQL*Plus 是一个C命令Line 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 

【讨论】:

在我之前的问题中,我已将所有 sql 脚本放在 PL/SQL 块中,但它不起作用,因为我必须对每个 DDL 语句使用 EXECUTE IMMEDIATE。不可能将 DDL 作为静态 SQL 发出在 Oracle 的 PL/SQL 块中 在我之前的问题中 哪个问题?您没有在当前问题中提及它。贴出sql脚本的详细信息。 该问题已被标记为重复并已关闭,但您可以在此处查看***.com/questions/31872132/… 好吧,这对我来说看起来很复杂,我必须对此进行更多调查。但是谢谢我现在知道它不可能在 pl sql 块中调用这样的脚本文件:) @Rahul 您需要将脚本放入块中,或者执行一些复杂的步骤,如上所示。不能直接从 PL/SQL 读取 OS 文件。祝你好运!。

以上是关于无法在 Oracle 匿名块中调用和执行 .sql 脚本文件的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 匿名 PL/SQL 块中缺少关键字错误

我可以在调用同一过程后将 PL/SQL 过程放在匿名块中吗?

Oracle 匿名块中的多个结果集

从 Oracle 函数返回一个表,在匿名块中定义

如何在匿名 PL/SQL 块中自动显示所有 SQL 语句的输出

匿名 pl/sql 块中的声明顺序