如何从Oracle SQL脚本中分离出各个sql语句,以便从java代码执行

我有Oracle DB 11g企业版,我想从我的java代码执行sql脚本.
我正在从.sql文件中读取此sql脚本,该脚本包含诸如create table,create type,alter table,drop type,drop procedure,insert into以及带有begin和end的pl / sql块以及所有此类构造的语句.

我的问题是,如何从java代码中分离出用于执行的单个sql语句?在MS SQL中,我可以简单地用GO关键字分隔这些sql语句,而在Oracle db中则没有这样的分隔符.通常在Oracle数据库脚本中用作分隔符的是什么?

作为一个例子,我在我的sql脚本中跟随创建触发器块以及其他sql语句.这里我有分号,我不能将其视为SQL语句终止章程(PL / SQL块本身可以包含多个以分号分隔的语句).这意味着我无法使用;类似于GO(在MS SQL中).

CREATE OR REPLACE TRIGGER SQLVersionHistory_SeqNum_TRG
   BEFORE INSERT 
   ON SQLVersionHistory
   FOR EACH ROW
   BEGIN
    :NEW.SequenceNumber := SQLVersionHistory_SeqNum.NEXTVAL;
   END;

解决方法:

是什么创建了你的sql脚本文件? sql脚本文件创建是否可修改?

如果您可以修改sql脚本文件创建,最简单的方法是在语句之​​间将自己的分隔符附加到脚本中. (评论应该是一个好主意)

如果没有,如果你只是在一个不可修改源的纯文本文件中收到一堆sql或pl / sql语句,那么你应该编写自己的解析算法.
您必须记住,每个sql语句都以分号(;)结尾,但由于PL / SQL块可以包含多个sql语句,因此它们必须在新行中以转发斜杠(/)结束.

令人困惑的部分是,一些SQL语句实际上是存储的PL / SQL块,如CREATE PROCEDURE或CREATE TRIGGER(文档手册“Oracle®DatabasePL / SQL语言参考”中的完整列表:http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/sqlstatements.htm#LNPLS99979)

(例如.

> ALTER,SELECT,DROP,GRANT等.语句以分号结束;
>以分号结束CREATE TABLESPACE,CREATE USER,CREATE TABLE等语句;
>创建程序,创建包,创建触发器等语句以斜杠结尾/
> DECLARE,BEGIN(匿名pl / sql块)语句以斜杠结尾/

)

问候

上一篇:oracle-11g – 在Oracle pl / sql中复制或调用java加密函数


下一篇:如何将数据库查询出来的字段值作为参数传入下一个请求中