Oracle中sql语句结束后,在Oracle中一次执行多条sql语句,结束符很重要

有时我们需要一次性执行多条sql语句,而用来更新的sql是根据实际情况用代码拼出来的

解决方案是把sql拼成下面这种形式:

begin

update TB_VG set seq = 1, vessel_id = 'Jin14', vessel_type = 'TRACK' where batch_number = '20837' and train_id = '0233086';

update TB_VG set seq = 2, vessel_id = 'Jin14', vessel_type = 'TRACK' where batch_number = '20992' and train_id = '0233110';

end;

总结如下:

以begin开始,以end;结尾(end后的分号不能省),中间的每个sql语句要以分号;结尾

在实际编码中,发现即使这样也会有错误发生,把sql语句中的换行符替换成空格就可以了

比较稳妥的编码方式是:

1、以正常的方式编写sql,根据阅读与编写的需要,中间肯定会有换行符

2、在执行之前进行替换:strSql = strSql.Replace("r\n", " ").Replace('\n', ' ');

-------------------------------------------------------------------------------------------

前几天做项目的时候发现了一个问题,那就是将许多的SQL语句连在一起去执行时竟然会出错,在SQLserver2000中就可把每句SQL用空格分开,直接就可以运行,这样在写程序的时候增加了不少的灵活性,而在ORACLE中就不行了。也许大家都会认为在每句的最后加上“;”就可以了,其实不然。在网上找了好多的方法,有的认为在SQLPLUS中用begin~~end可以解决,经过多次的实验还是解决不了问题,有的方法可以在SQLPLUS中运行,但是不符合项目的需要,如果在sqlplus中录入的话不用begin和end也可执行多条语句,只要每一行用分号结束,一行一条语句就可以。

问题,执行一段代码反回一个字符串,这个串中就是要执行我多条SQL语句。怎样让它在ORACLE中通过呢。想来想去想到了动态SQL,EXECUTE IMMEDIATE 这是一个解析和执行标准SQL语句的语法。只要在这条字符串中格式化一下我们要执行的语句就可以了,比如这条要执行的多条SQL的字符串为:

delete tableA where Aid=1;update tableB where Bid=2;insert into tableC values(id,3,4);

像这样的SQL语句想一起执行是不可以的,只要加点格式化就OK了,

要这样:BEGIN EXECUTE IMMEDIATE 'delete tableA where Aid=1';EXECUTE IMMEDIATE 'update tableB where Bid=2';EXECUTE IMMEDIATE 'insert into tableC values(id,3,4)';END;

注意,一定要写好格式,比如END后的分号。这样就可以在ORACLE中执行这个字符串了。

今天我在做一个项目的时候,需要向数据库(数据库是Oracle 8.0.5)一次同时插入多条数据,但是程序运行却出错:ORA-00911: 无效字符。SQL语句如下:

-------------------------------------------------------------------------------------------

DELETE FROM SYSROLEOPENR WHERE ROLEID = 2;

INSERT INTO SYSROLEOPENR

(PKID, ROLEID, OPERID)

SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID

FROM SYSMODULEOPER

WHERE OPERCODE = '300090010';

INSERT INTO SYSROLEOPENR

(PKID, ROLEID, OPERID)

SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID

FROM SYSMODULEOPER

WHERE OPERCODE = '300090020';

INSERT INTO SYSROLEOPENR

(PKID, ROLEID, OPERID)

SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID

FROM SYSMODULEOPER

WHERE OPERCODE = '300090050';

我去掉所有的;号,也报错。困惑了许久。如果数据库是SQL SERVER 2000,程序去掉分号后是可以正常运行的。后来发现在Oracle中需要加上begin

end才正确。改成以下的SQL就正确了:

BEGIN

DELETE FROM SYSROLEOPENR WHERE ROLEID = 2;

INSERT INTO SYSROLEOPENR

(PKID, ROLEID, OPERID)

SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID

FROM SYSMODULEOPER

WHERE OPERCODE = '300090010';

INSERT INTO SYSROLEOPENR

(PKID, ROLEID, OPERID)

SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID

FROM SYSMODULEOPER

WHERE OPERCODE = '300090020';

INSERT INTO SYSROLEOPENR

(PKID, ROLEID, OPERID)

SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID

FROM SYSMODULEOPER

WHERE OPERCODE = '300090050';

END;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值