深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/47143731

背景

近日有哥们问我如何实现多条数据以单条的方式插入到目标表里,为解决这个问题,下面来做个小实验。

交流过程如下:

下面,我们举例用cursor来完成这个目标。

(1)、实验准备

首先,建立一个实验表,如下:

createtableEMP

(

empno   NUMBER(4)notnull,

ename   VARCHAR2(1000),

job     VARCHAR2(9),

mgr     NUMBER(4),

hiredate

DATE,

sal

NUMBER(7,2),

comm    NUMBER(7,2),

deptno    NUMBER(6)

);

插入一些实验数据,如下:

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7369, 'SMITH', 'CLERK', 7902, to_date('17-12-1980', 'dd-mm-yyyy'), 800.00, null, 209999);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7499, 'ALLEN', 'SALESMAN', 7698, to_date('20-02-1981', 'dd-mm-yyyy'), 1600.00, 300.00, 30);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7521, 'WARD', 'SALESMAN', 7698, to_date('22-02-1981', 'dd-mm-yyyy'), 1250.00, 500.00, 30);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7566, 'JONES', 'MANAGER', 7839, to_date('02-04-1981', 'dd-mm-yyyy'), 2975.00, null, 20);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7654, 'MARTIN', 'SALESMAN', 7698, to_date('28-09-1981', 'dd-mm-yyyy'), 1250.00, 1400.00, 30);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7698, 'BLAKE', 'MANAGER', 7839, to_date('01-05-1981', 'dd-mm-yyyy'), 2850.00, null, 30);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7782, 'CLARK', 'MANAGER', 7839, to_date('09-06-1981', 'dd-mm-yyyy'), 2450.00, null, 10);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7788, 'SCOTT', 'ANALYST', 7566, to_date('19-04-1987', 'dd-mm-yyyy'), 3000.00, null, 20);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7839, 'KING', 'PRESIDENT', null, to_date('17-11-1981', 'dd-mm-yyyy'), 5000.00, null, 10);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7844, 'TURNER', 'SALESMAN', 7698, to_date('08-09-1981', 'dd-mm-yyyy'), 1500.00, 0.00, 30);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7876, 'ADAMS', 'CLERK', 7788, to_date('23-05-1987', 'dd-mm-yyyy'), 1100.00, null, 20);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7900, 'JAMES', 'CLERK', 7698, to_date('03-12-1981', 'dd-mm-yyyy'), 950.00, null, 30);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7902, 'FORD', 'ANALYST', 7566, to_date('03-12-1981', 'dd-mm-yyyy'), 3000.00, null, 20);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7934, 'MILLER', 'CLERK', 7782, to_date('23-01-1982', 'dd-mm-yyyy'), 1300.00, null, 10);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7771, 'hyl', 'dba', null, to_date('19-04-1987', 'dd-mm-yyyy'), 8000.00, null, 10);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7772, 'hyl', 'dba', null, to_date('19-04-1987', 'dd-mm-yyyy'), 8000.00, null, 10);

insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)

values (7773, 'hyl', 'dba', null, to_date('19-04-1987', 'dd-mm-yyyy'), 8000.00, null, 10);

创建一个关联表emp_2、再创建一个目标表emp_3,如下:

CREATETABLEEMP_2ASSELECT*FROMEMP;

CREATETABLEEMP_3ASSELECT*FROMEMPWHERE1=2;

删除一些关联表里的数据,如下:

DELETEFROMEMP_2  WHEREEMPNOIN(7771,7772,7773);

实验准备基本上完成了,利用工具我们看一下每张表的数据情况。

(2)、编写存储过程

下面我们利用cursor来实现对数据单条查询,然后单条插入的目的。

CREATE OR REPLACE PROCEDURE PD_CESHI IS

v_ErrorCode NUMBER; -- 错误代码

v_ErrorText VARCHAR2(4000); -- 错误信息

cursor c1 is

SELECT

a.EMPNO,

a.ENAME,

a.JOB,

a.MGR,

a.HIREDATE,

a.SAL,

a.COMM,

a.DEPTNO

FROM EMP a,EMP_2 b where a.empno=b.empno;

BEGIN

For te in c1 loop

begin

insert into EMP_3(

EMPNO,

ENAME,

JOB,

MGR,

HIREDATE,

SAL,

COMM,

DEPTNO

)

values(

te.EMPNO,

te.ENAME,

te.JOB,

te.MGR,

te.HIREDATE,

te.SAL,

te.COMM,

te.DEPTNO

);

EXCEPTION

WHEN NO_DATA_FOUND THEN

NULL;

WHEN OTHERS THEN

v_ErrorCode := SQLCODE;

v_ErrorText := SQLERRM;

/** 记录异常数据及错误信息 **/

insert into error_log(ID,TABLE_NAME,ERROR_ID,ERROR_CODE,ERROR_TEXT,CREATE_DATE) values(sys_guid(),'EMP_2',te.EMPNO,v_ErrorCode,v_ErrorText,sysdate);

end;

End loop;

commit;

/** 异常处理 过程异常**/

EXCEPTION

WHEN NO_DATA_FOUND THEN

NULL;

WHEN OTHERS THEN

v_ErrorCode := SQLCODE;

v_ErrorText := SQLERRM;

/** 记录异常数据及错误信息 **/

insert into error_log (ID,TABLE_NAME,ERROR_ID,ERROR_CODE,ERROR_TEXT,CREATE_DATE) values(sys_guid(),'EMP_OBJECT','',v_ErrorCode,v_ErrorText,sysdate);

END PD_CESHI;

创建一个记录错误日志的表:

create table ERROR_LOG

(

id VARCHAR2(32),

table_name VARCHAR2(100),

error_id VARCHAR2(100),

error_code VARCHAR2(100),

error_text VARCHAR2(4000),

create_date DATE default sysdate

);

(3)、开始实验

利用PL/SQL Developer工具完成存储过程的创建,我们下面来执行这个存储过程,如下:

完成后,我们来看一下目标表里的数据,如下:

看到以上的结果数据,我们已经把数据以遍历的形式插入到了我们的目标表里了。

如果这么说不具说服力,我们需要再进一步验证一下是否是单条插入的话。这里我们可以有这么个思路,如果这个是实现单条插入的,那么也就意味着如果中途有某条数据出现问题,将不会影响到其余数据的插入,因为这是以单条为单位插入的嘛~~

来验证一下。

(4)、模拟错误处理

TRUNCATE TABLE EMP_3;

SELECT * FROM EMP_3;

制造问题数据:

alter table EMP modify deptno NUMBER(6);

修改数据:

我们利用PL/SQL Developer工具把empno为7788的deptno由20修改为209999。这样的话,当我们插入到目标表中时,就会由于字段长度抛出一个错误来。

我们执行一下存储过程,如下:

存储过程执行完毕后,我们可以预见到7788的那条数据应该没有了,而其它的13条数据应该是可以正常插入的。我们来验证一下,如下:

可以看到结果中没有empno为7788的数据。

到错误记录日志表里看一下,如下:

我们可以看到,错误记录已经被记录到日志表里,抛出的1438错误(ORA-01438: 值大于为此列指定的允许精度)。

通过这种方式,我们从侧面也可以了解到,单条数据插入时,错误被抛出,不影响其它的数据插入。

实验完毕。

小实验,随手记之。

*******************************************蓝的成长记系列****************************************************

原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/huangyanlong)。

蓝的成长记——追逐DBA(1):奔波于路上,挺进山东

蓝的成长记——追逐DBA(2):安装!安装!久违的记忆,引起我对DBA的重新认知

蓝的成长记——追逐DBA(3):古董上操作,数据导入导出成了问题

蓝的成长记——追逐DBA(4):追忆少年情愁,再探oracle安装(Linux下10g、11g)

蓝的成长记——追逐DBA(5):不谈技术谈业务,恼人的应用系统

蓝的成长记——追逐DBA(6): 做事与做人:小技术,大为人

蓝的成长记——追逐DBA(7):基础命令,地基之石

蓝的成长记——追逐DBA(8):重拾SP报告,回忆oracle的STATSPACK实验

蓝的成长记——追逐DBA(9):国庆渐去,追逐DBA,新规划,新启程

蓝的成长记——追逐DBA(10):飞刀防身,熟络而非专长:摆弄中间件Websphere

蓝的成长记——追逐DBA(11):回家后的安逸,晕晕乎乎醒了过来

蓝的成长记——追逐DBA(12):七天七收获的SQL

蓝的成长记——追逐DBA(13):协调硬件厂商,六个故事:所见所感的“服务器、存储、交换机......”

蓝的成长记——追逐DBA(14):难忘的“云”端,起步的hadoop部署

蓝的成长记——追逐DBA(15):以为FTP很“简单”,谁成想一波三折

蓝的成长记——追逐DBA(16):DBA也喝酒,被捭阖了

蓝的成长记——追逐DBA(17):是分享,还是消费,在后IOE时代学会成长

******************************************************************************************************************

********************************************足球与oracle系列*************************************************

原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/huangyanlong)。

足球与oracle系列(1):32路诸侯点兵,oracle32进程联盟 之A组巴西SMON进程的大局观

足球与oracle系列(2):巴西揭幕战预演,oracle体系结构杂谈

足球与oracle系列(3):oracle进程排名,世界杯次回合即将战罢!

足球与oracle系列(4):从巴西惨败于德国,想到,差异的RAC拓扑对比!

足球与oracle系列(5):fifa14游戏缺失的directX库类比于oracle的rpm包!

足球与oracle系列(6):伴随建库的亚洲杯——加油中国队

******************************************************************************************************************

版权声明:本文为博主原创文章,未经博主允许不得转载。

oracle利用游标单条插入数据举例

标签:游标   实验

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:http://blog.csdn.net/huangyanlong/article/details/47143731

TAG标签:

游标实验

oracle如何把多条放单条,oracle利用游标单条插入数据举例相关推荐

  1. 2批量批量查询数据插入数据_你还在利用复制批量插入数据吗?一个oracle命令助你批量插入数据...

    大家好,我是RomMr,一个务实的科技人! 你还在用复制.粘贴的办法批量修改数据库数据吗?今天就和大家分享一个可以直接调用文档的命令来帮助大家批量修改,插入数据. 1.start 和 @ 命令 当我们 ...

  2. oracle去重保留一条_关于oracle数据库物理结构(文件)的一些总结

    概述 闲来无事,整理了下oracle数据库物理结构方面的内容,这里主要从数据库文件和操作系统文件两个方面来介绍.任何时候都要记得,数据库是数据存储的容器,作用是用来收集.存储数据和返回信息. 物理结构 ...

  3. oracle去重保留一条_mysql、oracle 去重(数据库删除重复数据保留一条)

    现在在数据库中有2对重复数据,2条正常数据,我想要把重复数据都删掉 讲一下思路 根据重复字段分组,并增加约束条件,查询出所有的,重复数据的最小id,和重复的属性 SELECT uname,MIN(ui ...

  4. MySQL 批量插入数据,单次插入多少条数据效率最高

    文章目录 一.前言 二.批量插入前准备 1.插入到数据表的字段 2.计算一行字段占用的空间 3.在数据里做插入操作的时候,整体时间的分配 三.批量插入数据测试 1.SQL语句的大小限制 2.查看服务器 ...

  5. oracle中按指定条数批量处理的方法

    oracle中按指定条数批量处理的方法 示例 --每处理10000条提交一次 loop insert into t2 select * from t1 where rownum <= 10000 ...

  6. oracle 取前10条记录

    1.oracle 取前10条记录 1) select * from tbname where rownum < 11; 2) select * from (select * from tbnam ...

  7. oracle into多个变量,Oracle中merge into的使用:该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据....

    该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了如下改动. 1,ins ...

  8. Oracle 随机获取N条数据

    Oracle 随机获取N条数据     当我们获取数据时,可能会有这样的需求,即每次从表中获取数据时,是随机获取一定的记录,而不是每次都获取一样的数据,这时我们可以采取Oracle内部一些函数,来达到 ...

  9. oracle 插入一个语句,oracle如何通过1条语句插入多个值 oracle通过1条语句插入多个值方法...

    本篇文章小编给大家分享一下oracle通过1条语句插入多个值方法,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 在实践过程中遇到一个问题, 我想往数据库插入多条数据时,使用 ...

  10. mysql导出oracle_如何将mysql中的表结构导出放入oracle中

    展开全部 将mysql中的表结构导出放入oracle中的方法: 1.导出mysql的表结构sql脚本,然后修改mysql中的数据类型为oracle中的数据类型: MySql与Oracle数据类型的62 ...

最新文章

  1. 今日工作总结及计划: 2022-02-14
  2. 【 MATLAB 】DFT的性质讨论(二)序列的循环移位及其 MATLAB 实现(频域方法)
  3. BUUCTF(misc)变异凯撒 --二
  4. 内存:你跑慢点行不行?CPU:跑慢点你养我吗?内存:我不管!
  5. PHP MySQL Functions (PDO_MYSQL)
  6. 实现QQ代理上网 如何写?
  7. Python学习教程:Python3内置模块之base64编解码方法小结
  8. [C++] 头文件中的#ifndef,#define,#endif以及#pragma用法
  9. 吐血分享9个软件下载网站以及那些开发者大佬的传奇人生
  10. 基于python的词频分析
  11. css after伪元素做文字下划线
  12. python格式化输出函数之format
  13. 用计算机怎么弹两只老虎,七键两只老虎曲谱_64键的电子琴怎么弹两只老虎1234567按哪个键...
  14. android手机和包支付,和包支付app
  15. Qt读写Excel--QXlsx设置字体格式、样式8
  16. Resultful接口实现后端文件下载
  17. 台式计算机硬盘的安装位置,台式电脑硬盘怎么安装_台式电脑硬盘安装方法-win7之家...
  18. 浅谈虚拟化软件再防泄密领域的表现如何
  19. Comparable+Comparator+Cloneable接口
  20. iPhone微信支持更换桌面图标了,超简单

热门文章

  1. vue项目里的简易的网格样式
  2. 家里的顶梁柱,社会的边角料
  3. 基于javaweb的家庭理财系统
  4. [OpenGL] 延迟贴花效果
  5. 天载杠杆炒股航天军工表现活跃
  6. 品酒论三国之一(创业时代的第三堂必修课:爱心会吸引幸福)
  7. 菜单知识点总结(kotlin)
  8. Dubbo3主推的Triple协议
  9. 通过ip获取用户所在地
  10. Sergey Levine-伯克利-深度强化学习2020