`

如何在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;

分享到:
评论

相关推荐

    经典全面的SQL语句大全

     现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。  为了取出几条随机选择的...

    万能数据库查询分析器(DB查询分析器) v7.023.zip

    6、提供了执行多条SQL语句的支持; 7、提供了对执行的一批SQL语句中每条SQL语句执行时间的记录,使用户更方便地了解SQL语句的执行效率。 8、更方地对各条SQL语句执行结果进行导出。 9、全面支持SQL语句中的三...

    oracle实验报告

    文件中每条SQL语句顺序装入缓冲区并执行。 二、 数据库命令——有关表、视图等的操作 1. 创建表employee 例1 定义一个人事信息管理系统中存放职工基本信息的一张表。可输入如下命令: SQL>CREATE TABLE employee ...

    2009达内SQL学习笔记

    多条SQL语句必须以分号分隔。多数DBMS不需要在单条SQL语句后加分号,但特定的DBMS可能必须在单条SQL语句后加分号。 SQL语句的最后一句要以 “;”号结束 二、写子句顺序 Select column,group_function From ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

     数据查询语言 (Data Query Language, DQL) 是SQL语言中,负责进行数据查询而不会对数据本身进行修改的语句,这是最基本的SQL语句。例如:SELECT(查询)  数据控制语言Data Controlling Language(DCL),用来...

    PL/SQL 基础.doc

    4) SQLJ: 很新的一种用Java访问Oracle数据库的方法,会的人不多; 5) JDBC 6) PL/SQL: 存储在数据库内运行, 其他方法为在数据库外对数据库访问,只适合ORACLE; 2. PL/SQL 1) PL/SQL(Procedual language/SQL)...

    最全的oracle常用命令大全.txt

    如果我们想知道user_indexes表各字段名称的详细含义,可以用下面这条SQL语句: SQL>select column_name,comments from dict_columns where table_name='USER_INDEXES'; 依此类推,就可以轻松知道数据字典的详细...

    Oracle9i的init.ora参数中文说明

    说明: 在 SQL 语句中, 应避免使用繁琐的 NLS_SORT 进程。正常情况下, WHERE 子句中进行的比较是二进制的, 但语言比较则需要 NLSSORT 函数。可以使用 NLS_COMP 指定必须根据NLS_SORT 会话参数进行语言比较。 值范围:...

    java面试800题

    Q0032 Oracle的集合操作函数,如sum(),avg(),max(),min(),与select,where,grouby,having的先后顺序,使用方法 Oracle集合查询基本知识,只有进行分组的列,才可以取在集合查询SQL语句中取字段,先Group By,再Having...

    C#编程经验技巧宝典

    79 <br>0116 如何在字符串中查找指定字符 79 <br>0117 如何在字符串中用一子串替换另一子串 80 <br>0118 将新字符串添加到已有字符串中 80 <br>0119 如何在字符串中添加多个空格 81 <br>0120...

    java 面试题 总结

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 17、abstract class和interface有什么区别? 声明方法...

    springmybatis

    而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记。后来项目结束了,我也没写总结文档。已经过去好久了。但最近突然又对这个ORM 工具感兴趣。因为接下来自己的项目中很有可能采用这个ORM工具。所以在此...

    Visual C++程序开发范例宝典(光盘) 第四部分

    实例184 执行一个外部程序直到其结束 实例185 调用具有参数的可执行程序 6.7 线程同步 实例186 利用事件对象实现线程同步 实例187 利用互斥对象实现线程同步 实例188 利用临界区实现线程同步 实例189 用信号...

    Visual C++程序开发范例宝典(光盘) 第八部分

    实例184 执行一个外部程序直到其结束 实例185 调用具有参数的可执行程序 6.7 线程同步 实例186 利用事件对象实现线程同步 实例187 利用互斥对象实现线程同步 实例188 利用临界区实现线程同步 实例189 用信号...

    mysql数据库的基本操作语法

    MySQL结束符是“;”结束。 1、 显示所有数据库 show databases; 2、 删除数据库 drop database dbName; 3、 创建数据库 create database [if not exists] dbName; 中括号部分可选的,判断该数据不存在就创建 4、 ...

    Visual C++ 程序开发范例宝典 源码 光盘 part2

    cc实例232 在VisualcC++中执行事务 cc实例233 在程序中执行SQL脚本 cc实例234 利用 SQL语句执行外围命令 第9章 SQL查询相关技术 9.1 通用查询 cc实例235 SQL语句的应用方法 cc实例236 SQL语句的模糊...

    Visual C++程序开发范例宝典(PDF扫描版).part3

     cc实例184 执行一个外部程序直到其结束   cc实例185 调用具有参数的可执行程序   6.7 线程同步   cc实例186 利用事件对象实现线程同步   cc实例187 利用互斥对象实现线程同步   cc实例188 利用...

    Visual C++程序开发范例宝典(PDF扫描版).part2

     cc实例184 执行一个外部程序直到其结束   cc实例185 调用具有参数的可执行程序   6.7 线程同步   cc实例186 利用事件对象实现线程同步   cc实例187 利用互斥对象实现线程同步   cc实例188 利用...

    疯狂JAVA讲义

    学生提问:既然内部类是外部类的成员,是否可以为外部类定义子类,在子类中再定义一个内部类来重写其父类中的内部类? 211 6.7.4 局部内部类 211 6.7.5 匿名内部类 212 6.7.6 闭包(Closure)和回调 215 6.8 ...

Global site tag (gtag.js) - Google Analytics