加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 15:02:46 所属栏目:百科 来源:网络整理
导读:有时我们需要一次性执行多条sql语句,而用来更新的sql是根据实际情况用代码拼出来的 解决方案是把sql拼成下面这种形式: begin updateTB_VGsetseq=1,vessel_id='Jin14',vessel_type='TRACK'wherebatch_number='20837'andtrain_id='0233086'; updateTB_VGsets
有时我们需要一次性执行多条sql语句,而用来更新的sql是根据实际情况用代码拼出来的

解决方案是把sql拼成下面这种形式:
begin
updateTB_VGsetseq=1,vessel_id='Jin14',vessel_type='TRACK'wherebatch_number='20837'andtrain_id='0233086';
updateTB_VGsetseq=2,vessel_type='TRACK'wherebatch_number='20992'andtrain_id='0233110';
end;
总结如下:
以begin开始,以end;结尾(end后的分号不能省),中间的每个sql语句要以分号;结尾
在实际编码中,发现即使这样也会有错误发生,把sql语句中的换行符替换成空格就可以了
比较稳妥的编码方式是:
1、以正常的方式编写sql,根据阅读与编写的需要,中间肯定会有换行符
2、在执行之前进行替换:strSql=strSql.Replace("rn","").Replace('n','');
-------------------------------------------------------------------------------------------
前几天做项目的时候发现了一个问题,那就是将许多的SQL语句连在一起去执行时竟然会出错,在SQLserver2000中就可把每句SQL用空格分开,直接就可以运行,这样在写程序的时候增加了不少的灵活性,而在ORACLE中就不行了。也许大家都会认为在每句的最后加上“;”就可以了,其实不然。在网上找了好多的方法,有的认为在SQLPLUS中用begin~~end可以解决,经过多次的实验还是解决不了问题,有的方法可以在SQLPLUS中运行,但是不符合项目的需要,如果在sqlplus中录入的话不用begin和end也可执行多条语句,只要每一行用分号结束,一行一条语句就可以。
问题,执行一段代码反回一个字符串,这个串中就是要执行我多条SQL语句。怎样让它在ORACLE中通过呢。想来想去想到了动态SQL,EXECUTEIMMEDIATE这是一个解析和执行标准SQL语句的语法。只要在这条字符串中格式化一下我们要执行的语句就可以了,比如这条要执行的多条SQL的字符串为:
deletetableAwhereAid=1;updatetableBwhereBid=2;insertintotableCvalues(id,3,4);
像这样的SQL语句想一起执行是不可以的,只要加点格式化就OK了,
要这样:BEGINEXECUTEIMMEDIATE'deletetableAwhereAid=1';EXECUTEIMMEDIATE'updatetableBwhereBid=2';EXECUTEIMMEDIATE'insertintotableCvalues(id,4)';END;
注意,一定要写好格式,比如END后的分号。这样就可以在ORACLE中执行这个字符串了。
今天我在做一个项目的时候,需要向数据库(数据库是Oracle8.0.5)一次同时插入多条数据,但是程序运行却出错:ORA-00911:无效字符。SQL语句如下:
DELETEFROMSYSROLEOPENRWHEREROLEID=2;
INSERTINTOSYSROLEOPENR
(PKID,ROLEID,OPERID)
SELECTSYSROLEOPENR_PKID_SEQ.NEXTVAL,'2'ROLEID,OPERID
FROMSYSMODULEOPER
WHEREOPERCODE='300090010';
WHEREOPERCODE='300090020';
WHEREOPERCODE='300090050';
我去掉所有的;号,也报错。困惑了许久。如果数据库是SQLSERVER2000,程序去掉分号后是可以正常运行的。后来发现在Oracle中需要加上begin
end才正确。改成以下的SQL就正确了:
BEGIN
END;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读