oracle 循环块,Oracle使用语句块之循环插入数据

1.业务要求:

将oracle表A的整表的数据一次性导入到表B中 , 以A_ID为外键关联.

(*******如果开发环境和实际生产环境的数据一致,而且数据量比较小情况,可以直接手动添加数据;

********实际情况: 开发环境和生产环境数据不一致, 而且开发者没有实际操作数据库的权限~所以通过提交sql脚本来生成数据)

2.实现方式:

这里用到oracle的语句块,游标,以及for循环.

3.准备工作

新建表A和B,添加序列和A表的数据

--auto-generated definition

create tableZ_A

(

IDNUMBER(10) not null

constraintZ_A_PKprimary key,

NAMEVARCHAR2(50)

)/commenton table Z_A is '测试用表,没有实用'

/;--auto-generated definition

create tableZ_B

(

IDNUMBER(10) not null

constraintZ_B_PKprimary key,

NAMEVARCHAR2(50),

A_NAMEVARCHAR2(50),

A_IDNUMBER(10)

)/commenton table Z_B is '测试用表,没有实用'

/;--序列

createsequence SEQ_Z_A

incrementby 1startwith 1maxvalue99999cycle

nocache;--序列

createsequence SEQ_Z_B

incrementby 1startwith 1maxvalue99999cycle

nocache;

给表A添加一点数据:

5f109ff94446dc13d6ff7465dc29c03b.png

5.SQL脚本

declare

--声明 B表序列ID

B_SEQ number(10);--查询所有A表ID

cursorcur_A is selectID, NAMEfromZ_A ;begin

for a incur_A

loop--查询B表序列ID

select SEQ_Z_B.nextval into B_SEQ fromdual;--插入B表数据

INSERT INTOZ_B (ID, NAME, A_NAME, A_ID)VALUES (B_SEQ, '测试B', a.NAME, a.ID);--commit;

endloop;commit;end;

6.效果

27ca3a38145fb7b7a51862e8bae94622.png

7.总结

1.声明: declare 关键字

可以用来声明一个变量, 比如上面的 B_SEQ作为 B表序列ID,当然也可以在后面的for里面直接使用 SEQ_Z_B.nextval 填充赋值, 这里是示范一下变量;

具体变量使用可以网上找一下资料,有点类似编程中的定义变量, 变量的类型还有字符串类型,Table类型等;

2.游标: cursor 关键字

游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。

在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。

这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率;

上面使用 cur_A将A表的ID和NAME暂时存放到游标中,在下面for循环中使用;

3.for循环:

听说有5中循环方式: Exit When、Loop、While、For(普通循环)、For(游标循环)

请参考: https://blog.csdn.net/qq_42305423/article/details/80753725

上面使用的是游标循环,有点类似编程中的foreach~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值