`
thisisvoa
  • 浏览: 63671 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    java代码oracle数据库批量插入

    这样可以在一次网络往返中执行多条SQL语句,减少网络开销。 - **创建PreparedStatement**: 通过`PreparedStatement pst = (PreparedStatement) con.prepareStatement(sql.toString());`创建PreparedStatement对象,...

    精通SQL【经典SQL语句大全】.pdf

    一条语句可以用分号或斜杠(/)结束,也可用RUN命令执行。 2. **数学运算**:在SQL中,你可以对数值或日期字段执行加减乘除等运算,运算符的优先级遵循标准的数学规则。 3. **别名ALIASES**:别名允许为列赋予一个...

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

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

    oracle相关SQL

    - **SQL命令执行**:使用`/`执行缓冲区中的最后一条SQL语句,`edit`编辑,`l`列出最后一条命令,`desc`查看表结构。 - **Shell和SQLPLUS切换**:使用`!shell`在SQLPLUS中执行shell命令。 - **SQL脚本**:在文件中...

    oracle实验报告

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

    PLSql循序渐进全面学习教程--Oracle

    在Oracle SQL PLUS环境中,SQL语句是不区分大小写的,每条语句可以使用数字分行,这些分行的语句在SQL PLUS中被称为缓冲区。语句通常以分号`;`或斜线`/`结束,也可通过RUN命令来执行。例如,你可以使用`SELECT`语句...

    oracle declare.docx

    但在执行部分,如果连续写多条SQL语句,可以省略分号。但如果SQL语句跨越多行,分号仍然需要。例如: ```sql INSERT INTO employee(depno, job) VALUES (20, 30); SELECT job INTO v_job FROM employee WHERE depno ...

    OCP 12c之01_12c_ocp_Sql_Workshop

    - 在SQL*Plus中,每个SQL语句必须以分号结束。 4. 列标题默认值 - SQL Developer中,默认的列标题对齐方式是左对齐,标题显示方式为大写。 - SQL*Plus中,字符和日期列标题左对齐,数字列标题右对齐,标题默认...

    重写oracle wm_contact函数

    此函数在Oracle数据库中用于连接多个字符串为一个单一的字符串。原生的`wm_concat`函数虽然能够满足基本需求,但在特定场景下可能无法满足高效、定制化的数据处理需求。因此,本示例展示了一种重写该函数的方法,...

    关于oracle存储过程的基本语法

    Oracle存储过程是一种在Oracle数据库中存储的一段可执行的SQL代码或PL/SQL代码,它可以帮助开发人员实现复杂的业务逻辑处理,提高应用程序的性能,并简化数据库管理。 #### 二、Oracle存储过程的基本结构 存储过程...

    SQL详解入门

    至于分号,虽然不是所有系统都强制要求,但在多语句的请求中,分号作为语句结束符是通用的做法。 SQL还可分为两大类:数据操作语言(DML)和数据定义语言(DDL)。DML涵盖了用于查询、更新、删除和插入数据的语句,如`...

    SQL编程规范.zip

    - 保持代码整洁,每条SQL语句结束后换行。 - 使用缩进来表示嵌套结构,如子查询或CASE语句。 - 长语句应考虑拆分为多个短语句,提高可读性。 4. **查询效率**: - 避免全表扫描,使用索引来加速查询,尤其是在...

    oracle命令

    `作为命令结束符,而在Oracle中则需要使用`begin/end;`块来包裹多条语句。 ```csharp this.oleDbCommand1.CommandText = "begin INSERT INTO GROUP_INFO(GROUP_ID, GROUP_NAME) VALUES (1, '2'); INSERT INTO GROUP...

    SQL教程

    正确使用分号可以帮助解析器区分不同的语句,尤其是在同一行中写多条命令时。 SQL SELECT语句是查询数据的基础,它允许你从一个或多个表中选择特定列,并根据条件过滤数据。SELECT语句可以包含多种元素,如选择的列...

    Oracle提高sql执行效率的心得建议

    在Oracle数据库管理中,优化SQL语句的执行效率至关重要,因为这直接影响到系统的整体性能和响应时间。以下是一些提高SQL执行效率的心得建议: 1. **基础表选择**:在FROM子句中有多个表连接时,应选择记录条数最少...

    DB2编程基础要点 sql 存储过程

    DB2编程基础要点主要涉及SQL语句的使用和存储过程的创建。在DB2数据库管理系统中,编程工作是一项核心任务,对于数据的增删改查和处理流程的自动化至关重要。 首先,创建存储过程时,必须注意语法的严谨性。在使用`...

    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),用来...

Global site tag (gtag.js) - Google Analytics