游标语法


drop table student;
create table student
(
stuNo int primary key,
Name varchar2(10),
address varchar2(30),
birthday date
);

insert into student values(1,'梅超风','山东',to_date('1860-02-12 12:12:23','YYYY-MM-DD HH24:MI:SS'));
insert into student values(2,'陆成风','山西',to_date('1860-2-12','YYYY-MM-DD'));
insert into student values(3,'冯默风','安徽','10-2月-1886');
insert into student values(4,'曲灵风','湖南常德',to_date('1870-02-12 12:12:23','YYYY-MM-DD HH24:MI:SS'));


Rem ===================================================================
Rem 隐式游标
Rem ===================================================================

SET SERVEROUTPUT ON;
BEGIN
UPDATE student SET address='河南洛阳'
WHERE stuNo = 1;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('表已更新');
END IF;
END;
/

BEGIN
UPDATE student SET address=replace(address,'南','北')
WHERE address LIKE '%南%';
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('未找到数据........');
ELSE
DBMS_OUTPUT.PUT_LINE('影响了'||SQL%ROWCOUNT||'行');
END IF;
END;
/

Rem ===================================================================
Rem 显式游标
Rem ===================================================================
--使用游标显示name列的值
DECLARE
l_name VARCHAR2(20);
CURSOR stu_name_cur IS SELECT name from student;
BEGIN
OPEN stu_name_cur; --打开游标
LOOP
FETCH stu_name_cur INTO l_name;
DBMS_OUTPUT.PUT_LINE(stu_name_cur%ROWCOUNT);
EXIT WHEN stu_name_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('姓名:'||l_name);
END LOOP;
CLOSE stu_name_cur; --关闭游标
END;
/


--带参数的游标
DECLARE
l_name VARCHAR2(20);
l_stuNO NUMBER(2);
CURSOR stu_name_cur(sNo NUMBER)
IS SELECT name from student
WHERE stuNo>sNo;
BEGIN
l_stuNO:=&stuNO;
OPEN stu_name_cur(l_stuNO); --打开游标
LOOP
FETCH stu_name_cur INTO l_name;

EXIT WHEN stu_name_cur%NOTFOUND;

DBMS_OUTPUT.PUT_LINE('姓名:'||l_name);
END LOOP;
CLOSE stu_name_cur; --关闭游标
END;
/

Rem ===================================================================
Rem 使用显示游标修改数据
Rem ===================================================================

DECLARE
l_birthday DATE;
l_stuNO NUMBER(2);
CURSOR stu_name_cur(sNo NUMBER)
IS SELECT birthday from student
WHERE stuNo>sNo FOR UPDATE OF birthday;
BEGIN
l_stuNO:=&stuNO;
OPEN stu_name_cur(l_stuNO); --打开游标
LOOP
FETCH stu_name_cur INTO l_birthday;
EXIT WHEN stu_name_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('出生年月:'||to_char(l_birthday,'yyyy"年"mm"月"dd"日"'));
UPDATE student SET birthday=ADD_MONTHS(l_birthday,2)
WHERE CURRENT OF stu_name_cur; --更新当前行
END LOOP;
CLOSE stu_name_cur; --关闭游标
COMMIT;
END;
/

Rem ===================================================================
Rem 使用显示游标删除记录
Rem ===================================================================

DECLARE
l_stu_rec student%ROWTYPE;
CURSOR del_cur IS select * from student FOR UPDATE;
BEGIN
OPEN del_cur;
LOOP
FETCH del_cur into l_stu_rec;
EXIT WHEN del_cur%NOTFOUND;
IF l_stu_rec.stuno=2 THEN
DELETE FROM student WHERE CURRENT OF del_cur; --删除当前行
END IF;
END LOOP;
END;
/

Rem ===================================================================
Rem 循环游标
Rem ===================================================================

DECLARE
CURSOR stu_cur IS
SELECT stuNo,name,address FROM student;
BEGIN
FOR stu IN stu_cur --不要加分号
LOOP
DBMS_OUTPUT.PUT_LINE(stu.stuNO||' '||stu.name||' '||stu.address);
END LOOP;
END;
/

Rem ===================================================================
Rem 弱类型REF游标
Rem ===================================================================

DECLARE
sNo student.stuNo%type;
sName student.name%type;
sAddress student.address%type;

TYPE stu_cur_ref IS REF CURSOR; --声明REF游标类型
stu_cur stu_cur_ref; --声明“stu_cur_ref”游标类型变量
BEGIN
OPEN stu_cur FOR
SELECT stuNo,name,address FROM student;
LOOP
FETCH stu_cur INTO sNo,sName,sAddress;
EXIT WHEN stu_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(sNo||' '||sName||' '||sAddress);
END LOOP;
CLOSE stu_cur;
END;
/

DECLARE
l_stuno student.stuno%TYPE;
l_name student.name%TYPE;
TYPE stu_cur_ref IS REF CURSOR;
curStu stu_cur_ref;
BEGIN
OPEN curStu FOR
SELECT stuno,name FROM student;
LOOP
FETCH curStu INTO l_stuno,l_name;
EXIT WHEN curStu%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(l_stuno||' '||l_name);
END LOOP;
CLOSE curStu;
END;
/

Rem ===================================================================
Rem 强类型REF游标
Rem ===================================================================

DECLARE
TYPE l_stu_type IS RECORD( --自定义记录类型
sNo student.stuNo%type,
sName student.name%type,
sAddress student.address%type
);
l_stu l_stu_type; --声明自定义类型变量
TYPE stu_cur_ref IS REF CURSOR --声明REF游标类型
RETURN l_stu_type; --返回类型为自定义类型
stu_cur stu_cur_ref; --声明“stu_cur_ref”游标类型变量
BEGIN
OPEN stu_cur FOR
SELECT stuNo,name,address FROM student;
LOOP
FETCH stu_cur INTO l_stu;
EXIT WHEN stu_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(l_stu.sNo||' '||
l_stu.sName||' '||l_stu.sAddress);
END LOOP;
CLOSE stu_cur;
END;
/

DECLARE
TYPE l_stu_type IS RECORD(
sno student.stuno%TYPE,
sname student.name%TYPE
);
l_stu l_stu_type;
TYPE stu_cur_ref IS REF CURSOR RETURN l_stu_type;
stu_cur stu_cur_ref;
BEGIN
OPEN stu_cur FOR
SELECT stuno,name FROM student;
LOOP
FETCH stu_cur INTO l_stu;
EXIT WHEN stu_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(l_stu.sno||' '||l_stu.sname);
END LOOP;
CLOSE stu_cur;
END;
/

Rem ===================================================================
Rem 使用游标变量执行动态 SQL
Rem ===================================================================

DECLARE
l_stu student%ROWTYPE;
TYPE stu_cur_ref IS REF CURSOR; --声明REF游标类型
stu_cur stu_cur_ref; --声明“stu_cur_ref”游标类型变量
l_stuNo NUMBER(2);
BEGIN
l_stuNo := &sNo;
OPEN stu_cur FOR
'SELECT * FROM student WHERE stuNo>:1'
USING l_stuNo; --绑定参数
LOOP
FETCH stu_cur INTO l_stu;
EXIT WHEN stu_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(l_stu.stuNo||' '||l_stu.name||' '||l_stu.address||
' '||l_stu.birthday);
END LOOP;
CLOSE stu_cur;
END;
/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这些错误提示是关于Git钩子文件的问题。Git钩子是在特定的Git操作(如提交、推送等)前后执行的脚本。根据引用\[1\]和引用\[3\]的描述,解决这些错误的方法是删除项目文件夹下的`.git/hooks`目录中对应的文件,比如`pre-commit`、`pre-push`和`commit-msg`文件。这样,当你再次执行相关的Git操作时,就不会再出现这些错误了。 引用\[1\]: 删除项目文件夹下`.git/hooks/pre-commit`和`.git/hooks/pre-push`文件\[1\]。 引用\[3\]: 删除项目文件夹下`.git/hooks/commit-msg`文件\[3\]。 #### 引用[.reference_title] - *1* [【解决】cannot spawn .git/hooks/pre-commit: No such file or directory](https://blog.csdn.net/qq_25231683/article/details/131020562)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [error: cannot run .git/hooks/pre-commit: No such file or directory解决方法](https://blog.csdn.net/chaihuasong/article/details/53087298)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [cannot spawn .git/hooks/commit-msg: No such file or directory](https://blog.csdn.net/weixin_43842853/article/details/123096696)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值