【DM】DMSQL程序的基本操作——包括语句块、游标和动态SQL

程序

BEGIN

UPDATE TEST SET C2 = ‘韩梅梅’ WHERE C1=1;

IF SQL%NOTFOUND THEN

PRINT ‘查无此人’;

ELSE

PRINT ‘修改成功’;

END IF;

END;

结果

SQL> BEGIN

2 UPDATE TEST SET C2 = ‘韩梅梅’ WHERE C1=1;

3 IF SQL%NOTFOUND THEN

4 PRINT ‘查无此人’;

5 ELSE

6 PRINT ‘修改成功’;

7 END IF;

8 END;

9 /

查无此人

DMSQL 过程已成功完成

已用时间: 0.712(毫秒). 执行号:1745.

显式

显式游标指向一个查询语句执行后的结果集区域。当需要处理返回多条记录的查询时,应显式地定义游标以处理结果集的每一行。

使用显式游标的步骤:

  • 定义:声明游标及其关联查询语句。

  • 打开:执行。将查询结果装入工作区,游标被定位到结果集的第一行之前。

  • 拨动:根据需要将游标位置移动到结果集的合适位置。

  • 关闭:使用完游标后关闭,释放其占用的资源。

实例

插入测试数据

INSERT INTO TEST VALUES(1,‘韩梅梅’),(2,‘李华’);

程序

DECLARE

A INT;

B VARCHAR(50);

CURSOR C FOR SELECT * FROM TEST; --定义游标

BEGIN

OPEN C ; --打开游标

LOOP

FETCH C INTO A,B; --拨动游标

EXIT WHEN C%NOTFOUND;

PRINT A||‘–’||B;

END LOOP;

CLOSE C; --关闭游标

END;

结果

SQL> DECLARE

2 A INT;

3 B VARCHAR(50);

4 CURSOR C FOR SELECT * FROM TEST;

5 BEGIN

6 OPEN C ;

7 LOOP

8 FETCH C INTO A,B;

9 EXIT WHEN C%NOTFOUND;

10 PRINT A||‘–’||B;

11 END LOOP;

12 CLOSE C;

13 END;

14 /

1–韩梅梅

2–李华

DMSQL 过程已成功完成

已用时间: 0.234(毫秒). 执行号:1794.

动态游标


与静态游标不同,动态游标在声明部分只是先声明一个游标类型的变量,并不指定其关联的查询语句,在执行部分打开游标时才指定查询语句。

实例

程序

DECLARE

A INT;

B VARCHAR(50);

C CURSOR; --声明游标

BEGIN

OPEN C FOR SELECT * FROM TEST; --定义并打开游标

LOOP

FETCH C INTO A,B; --拨动游标

EXIT WHEN C%NOTFOUND;

PRINT A||‘–’||B;

END LOOP;

CLOSE C; --关闭游标

END;

结果

SQL> DECLARE

2 A INT;

3 B VARCHAR(50);

4 C CURSOR;

5 BEGIN

6 OPEN C FOR SELECT * FROM TEST;

7 LOOP

8 FETCH C INTO A,B;

9 EXIT WHEN C%NOTFOUND;

10 PRINT A||‘–’||B;

11 END LOOP;

12 CLOSE C;

13 END;

14 /

1–韩梅梅

2–李华

DMSQL 过程已成功完成

已用时间: 0.350(毫秒). 执行号:1795.

游标变量


游标变量不是真正的游标对象,而是指向游标对象的一个指针,因此是一种引用类型,也可以成为引用游标。

引用游标的特点:

  • 不局限于一个查询

  • 可以被赋值

  • 可以作为变量使用

  • 可以在DMSQL的子程序中传递结果集

实例

将TEST2表中的数据合并到TEST表中

建测试数据

DROP TABLE IF EXISTS TEST2;

CREATE TABLE TEST2(C1 INT,C2 VARCHAR(50));

INSERT INTO TEST2 VALUES(5,‘刘磊’),(6,‘叶枫’);

程序

DECLARE

CSR CURSOR; --声明游标

PROCEDURE PROC(CSR IN CURSOR) IS --定义存储过程

PERSON TEST%ROWTYPE; --定义结果集

/子程序开始/

BEGIN

LOOP

FETCH CSR INTO PERSON; --拨动游标,将数据放入结果集

EXIT WHEN CSR%NOTFOUND;

INSERT INTO TEST

VALUES(PERSON.C1,PERSON.C2);–将结果集中的数据插入到TEST表中

COMMIT;

END LOOP;

END;

/子程序结束/

BEGIN

OPEN CSR FOR SELECT * FROM TEST2; --对游标进行定义

PROC(CSR); --存储过程调用游标

CLOSE CSR; --关闭游标

END;

结果

SQL> DECLARE

2 CSR CURSOR; --声明游标

3 PROCEDURE PROC(CSR IN CURSOR) IS --定义存储过程

4 PERSON TEST%ROWTYPE; --定义结果集

5 /子程序开始/

6 BEGIN

7 LOOP

8 FETCH CSR INTO PERSON; --拨动游标,将数据放入结果集

9 EXIT WHEN CSR%NOTFOUND;

10 INSERT INTO TEST

11 VALUES(PERSON.C1,PERSON.C2);–将结果集中的数据插入到TEST表中

12 END LOOP;

13 END;

14 /子程序结束/

15 BEGIN

16 OPEN CSR FOR SELECT * FROM TEST2; --对游标进行定义

17 PROC(CSR); --存储过程调用游标

18 CLOSE CSR; --关闭游标

19 END;

20 /

DMSQL 过程已成功完成

已用时间: 0.303(毫秒). 执行号:1912.

SQL> SELECT * FROM TEST;

行号 C1 C2


1 3 韩梅梅

2 2 李华

3 5 刘磊

4 6 叶枫

已用时间: 6.982(毫秒). 执行号:1913.

使用游标更新和删除数据


使用游标进行数据的更新或删除时,关联的查询语句中一定要使用”FOR UPDATE“选项,它的意义在于对要修改的行上锁,以防用户在同一行上进行修改操作。

实例——更新

程序

将TEST表中C1=1的行的C1字段改为3

DECLARE

CURSOR CSR IS SELECT C2 FROM TEST WHERE C1=1 --定义游标

FOR UPDATE; --加锁

BEGIN

OPEN CSR; --打开游标

IF CSR%ISOPEN THEN --判断游标是否被打开

FETCH CSR; --拨动游标

UPDATE TEST SET C1=3 WHERE CURRENT OF CSR; --数据更新

ELSE

PRINT ‘CURSOR IS NOT OPENED’;

END IF;

CLOSE CSR; --关闭游标

END;

结果

SQL> DECLARE

2 CSR CURSOR; --声明游标

3 PROCEDURE PROC(CSR IN CURSOR) IS --定义存储过程

4 PERSON TEST%ROWTYPE; --定义结果集

5 /子程序开始/

6 BEGIN

7 LOOP

8 FETCH CSR INTO PERSON; --拨动游标,将数据放入结果集

9 EXIT WHEN CSR%NOTFOUND;

10 INSERT INTO TEST

11 VALUES(PERSON.C1,PERSON.C2);–将结果集中的数据插入到TEST表中

12 END LOOP;

13 END;

14 /子程序结束/

15 BEGIN

16 OPEN CSR FOR SELECT * FROM TEST2; --对游标进行定义

17 PROC(CSR); --存储过程调用游标

18 CLOSE CSR; --关闭游标

19 END;

20 /

DMSQL 过程已成功完成

已用时间: 0.303(毫秒). 执行号:1912.

SQL> SELECT * FROM TEST;

行号 C1 C2


1 3 韩梅梅

2 2 李华

3 5 刘磊

4 6 叶枫

已用时间: 6.982(毫秒). 执行号:1913.

实例——FOR循环

游标FOR循环自动使用FOR循环依次读取结果集中的数据。当FOR循环开始时,游标自动打开,故而不需要使用OPEN方法;每循环一次自动读取游标当前行的数据,故而不需要使用FETCH;数据遍历完毕自动推出FOR循环时,游标自动关闭,故而不需要CLOSE。

程序

BEGIN

FOR CSR IN (SELECT * FROM TEST)

LOOP

DBMS_OUTPUT.PUT_LINE(CSR.C1||‘是’||CSR.C2||‘同学’);

END LOOP;

END;

结果

SQL> BEGIN

2 FOR CSR IN (SELECT * FROM TEST)

3 LOOP

4 DBMS_OUTPUT.PUT_LINE(CSR.C1||‘是’||CSR.C2||‘同学’);

5 END LOOP;

6 END;

7 /

3是韩梅梅同学

2是李华同学

DMSQL 过程已成功完成

已用时间: 36.871(毫秒). 执行号:1810.

动态SQL

====================================================================

前面讲的SQL语句都是静态SQL,即先编译后执行的。除此之外,DMSQL还支持动态SQL,编译时不对其进行处理,运行时才被生成并执行。

最典型的如动态传参问题:

实例

程序

CREATE OR REPLACE PROCEDURE PRO(NUM IN INT) AS

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后总结我的面试经验

2021年的金三银四一眨眼就到了,对于很多人来说是跳槽的好机会,大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。

BAT面试经验

实战系列:Spring全家桶+Redis等

其他相关的电子书:源码+调优

面试真题:


《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
有帮助,可以扫码获取!!(备注Java获取)**

img

最后总结我的面试经验

2021年的金三银四一眨眼就到了,对于很多人来说是跳槽的好机会,大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。

[外链图片转存中…(img-PjdjDSSi-1713391492243)]

BAT面试经验

实战系列:Spring全家桶+Redis等

[外链图片转存中…(img-Ynyk12mZ-1713391492243)]

其他相关的电子书:源码+调优

[外链图片转存中…(img-vQinG8jy-1713391492244)]

面试真题:

[外链图片转存中…(img-U8YeLeYI-1713391492244)]

[外链图片转存中…(img-OK4sB4i5-1713391492244)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值