程序
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,即先编译后执行的。除此之外,DMSQL还支持动态SQL,编译时不对其进行处理,运行时才被生成并执行。
最典型的如动态传参问题:
实例
程序
CREATE OR REPLACE PROCEDURE PRO(NUM IN INT) AS
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/f5815fcde9d4b8a8d031ffb9019e8b00.jpeg)
最后总结我的面试经验
2021年的金三银四一眨眼就到了,对于很多人来说是跳槽的好机会,大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。
另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。
BAT面试经验
实战系列:Spring全家桶+Redis等
其他相关的电子书:源码+调优
面试真题:
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
有帮助,可以扫码获取!!(备注Java获取)**
![img](https://img-blog.csdnimg.cn/img_convert/f5815fcde9d4b8a8d031ffb9019e8b00.jpeg)
最后总结我的面试经验
2021年的金三银四一眨眼就到了,对于很多人来说是跳槽的好机会,大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。
另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。
[外链图片转存中…(img-PjdjDSSi-1713391492243)]
BAT面试经验
实战系列:Spring全家桶+Redis等
[外链图片转存中…(img-Ynyk12mZ-1713391492243)]
其他相关的电子书:源码+调优
[外链图片转存中…(img-vQinG8jy-1713391492244)]
面试真题:
[外链图片转存中…(img-U8YeLeYI-1713391492244)]
[外链图片转存中…(img-OK4sB4i5-1713391492244)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!