首页 > 数据库 >oracle 游标总结

oracle 游标总结

时间:2023-04-26 19:34:10浏览次数:41  
标签:总结 END SAL 游标 EMPNO EMP oracle LOOP ROW


for循环游标


DECLARE
CURSOR C_EMP IS SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE JOB = 'MANAGER';
V_ROW C_EMP%ROWTYPE;
BEGIN
  FOR V_ROW IN C_EMP LOOP
    DBMS_OUTPUT.put_line(V_ROW.EMPNO || '-' || V_ROW.ENAME || '-' || V_ROW.JOB || '-' || V_ROW.SAL);
  END LOOP;
END;



或者

DECLARE
CURSOR C_EMP IS SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE JOB = 'MANAGER';
V_ROW EMP%ROWTYPE;
BEGIN
  FOR V_ROW IN C_EMP LOOP
    DBMS_OUTPUT.put_line(V_ROW.EMPNO || '-' || V_ROW.ENAME || '-' || V_ROW.JOB || '-' || V_ROW.SAL);
  END LOOP;
END;



或者

DECLARE
CURSOR C_EMP IS SELECT * FROM EMP;
V_ROW EMP%ROWTYPE;
BEGIN
  FOR V_ROW IN C_EMP LOOP
    DBMS_OUTPUT.put_line(V_ROW.EMPNO || '-' || V_ROW.ENAME || '-' || V_ROW.JOB || '-' || V_ROW.SAL);
  END LOOP;
END;




fetch游标


DECLARE
CURSOR C_EMP IS SELECT * FROM EMP;
V_ROW EMP%ROWTYPE;
BEGIN
  OPEN C_EMP;
  LOOP
    FETCH C_EMP INTO V_ROW;
    EXIT WHEN C_EMP%NOTFOUND;
    DBMS_OUTPUT.put_line(V_ROW.EMPNO || '-' || V_ROW.ENAME || '-' || V_ROW.JOB || '-' || V_ROW.SAL);
  END LOOP;
  CLOSE C_EMP;
END;



隐式游标


BEGIN
  UPDATE EMP SET ENAME = 'SMITH' WHERE EMPNO = 7369;
  COMMIT;
  DBMS_OUTPUT.put_line('SQL%ROWCOUNT = ' || SQL%ROWCOUNT);
  IF SQL%ISOPEN THEN
    DBMS_OUTPUT.put_line('SQL%ISOPEN');
  ELSE
    DBMS_OUTPUT.put_line('NOT SQL%ISOPEN');
  END IF;
  IF SQL%FOUND THEN
    DBMS_OUTPUT.put_line('SQL%FOUND');
  ELSE
    DBMS_OUTPUT.put_line('NOT SQL%FOUND');
  END IF;
  IF SQL%NOTFOUND THEN
    DBMS_OUTPUT.put_line('SQL%NOTFOUND');
  ELSE
    DBMS_OUTPUT.put_line('NOT SQL%NOTFOUND');
  END IF;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.put_line('NO_DATA_FOUND');
    WHEN TOO_MANY_ROWS THEN
      DBMS_OUTPUT.put_line('TOO_MANY_ROWS');
END;




while循环游标


DECLARE
CURSOR C_EMP IS SELECT * FROM EMP;
V_ROW EMP%ROWTYPE;
BEGIN
  OPEN C_EMP;
  FETCH C_EMP INTO V_ROW;
  WHILE C_EMP%FOUND LOOP
    DBMS_OUTPUT.put_line(V_ROW.EMPNO || '-' || V_ROW.ENAME || '-' || V_ROW.JOB || '-' || V_ROW.SAL);
    FETCH C_EMP INTO V_ROW;
  END LOOP;
  CLOSE C_EMP;
END;



参数游标


DECLARE
CURSOR C_EMP(P_EMPNO NUMBER) IS SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE EMPNO = P_EMPNO;
V_ROW EMP%ROWTYPE;
BEGIN
  FOR V_ROW IN C_EMP(7369) LOOP
    DBMS_OUTPUT.put_line(V_ROW.EMPNO||V_ROW.ENAME||V_ROW.SAL);
  END LOOP;
END;



更新游标

 

CREATE TABLE EMP1 AS SELECT * FROM EMP;

 

DECLARE
CURSOR C_EMP IS
SELECT E.EMPNO, E.ENAME, E.JOB, E.SAL, D.DEPTNO
FROM EMP1 E, DEPT D
WHERE E.DEPTNO = D.DEPTNO FOR UPDATE OF E.DEPTNO;
V_ROW EMP1%ROWTYPE;
V_SAL EMP1.SAL%TYPE;
BEGIN
  FOR V_ROW IN C_EMP LOOP
    IF V_ROW.SAL < 1500 THEN
      V_SAL := V_ROW.SAL * 1.2;
    ELSIF V_ROW.SAL < 2000 THEN
      V_SAL := V_ROW.SAL * 1.5;
    ELSIF V_ROW.SAL < 3000 THEN
      V_SAL := V_ROW.SAL * 2;
    END IF;
    UPDATE EMP1 SET SAL=V_SAL WHERE CURRENT OF C_EMP;
  END LOOP;
  COMMIT;
END;

锁住E表中满足条件的行。

或者


DECLARE
CURSOR C_EMP IS SELECT EMPNO, ENAME, JOB, SAL FROM EMP1 FOR UPDATE;
V_ROW EMP1%ROWTYPE;
V_SAL EMP1.SAL%TYPE;
BEGIN
  FOR V_ROW IN C_EMP LOOP
    IF V_ROW.SAL < 1500 THEN
      V_SAL := V_ROW.SAL * 1.2;
    ELSIF V_ROW.SAL < 2000 THEN
      V_SAL := V_ROW.SAL * 1.5;
    ELSIF V_ROW.SAL < 3000 THEN
      V_SAL := V_ROW.SAL * 2;
    END IF;
    UPDATE EMP1 SET SAL=V_SAL WHERE CURRENT OF C_EMP;
  END LOOP;
  COMMIT;
END;



锁住所有行。


或者


DECLARE
CURSOR C_EMP IS SELECT EMPNO, ENAME, JOB, SAL FROM EMP1 FOR UPDATE NOWAIT;
V_ROW EMP1%ROWTYPE;
V_SAL EMP1.SAL%TYPE;
BEGIN
  FOR V_ROW IN C_EMP LOOP
    IF V_ROW.SAL < 1500 THEN
      V_SAL := V_ROW.SAL * 1.2;
    ELSIF V_ROW.SAL < 2000 THEN
      V_SAL := V_ROW.SAL * 1.5;
    ELSIF V_ROW.SAL < 3000 THEN
      V_SAL := V_ROW.SAL * 2;
    END IF;
    UPDATE EMP1 SET SAL=V_SAL WHERE CURRENT OF C_EMP;
  END LOOP;
  COMMIT;
END;



默认情况下当前会话要一直等待对方释放锁,使用nowait子句可以避免等待锁


标签:总结,END,SAL,游标,EMPNO,EMP,oracle,LOOP,ROW
From: https://blog.51cto.com/u_1002776/6228668

相关文章

  • mvn 构建错误总结
    问题总结:mvn仓库查找顺序本地仓库=>没有就找中央仓库=>远程仓库mvn构建失败三大原因1.误删除./m2文件夹,构建失败解决:重新使用中央仓库拉取配置2.本地仓库是否有错误依赖(以lastUpdated结尾)缓存失败;产生的原因:可能是网络波动或者前期新手配置有误解决方案:删除本地有问......
  • 【收藏】网络安全信息收集知识大总结!!!
    资产收集概述渗t的本质是信息收集,信息收集又名资产收集。在确定了范围、目标、方法之后就到进行情报收集阶段。这个阶段收集的信息,确定了往后渗t测试的走向。收集的信息越多越好,项目的成功与否,与信息收集息息相关,由此可见信息收集是有多重要。whois查询域名注册信息信息包括注册人......
  • 用java调用oracle存储过程总结
    用java调用oracle存储过程总结[code]1、什么是存储过程。存储过程是数据库服务器端的一段程序,它有两种类型。一种类似于SELECT查询,用于检索数据,检索到的数据能够以数据集的形式返回给客户。另一种类似于INSERT或DELETE查询,它不返回数据,只是执行一个动作。......
  • Oracle数据库设计——定义约束 主键
    Oracle数据库设计——定义约束主键[code]声明约束主键(PRIMARYKEY)一张表不一定有主键,但大多数表都创建了主键,主键值必须唯一并且组成主键的各列都不能为空。想象一下存储学生信息的一张表。在学生表(STUDENTS)每个学生有且仅有一行记录。因此,在S......
  • Java泛型简单总结
    [code]Java泛型简单总结1)基本概念:泛型(GenericType或Generics)是对Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看做是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的占位符一......
  • Oracle中UNION 与UNION ALL的学习
    Oracle中UNION与UNIONALL的学习[code]1、UNION:并集,所有的内容都查询,重复的显示一次;2、UNIONALL:并集,所有的内容都显示,包括重复的;3、INTERSECT:交集,只显示重复的;4、MINUS:差集,只显示对方没有的(跟顺序是有关系的)两者都是对记录集操作,把来自许多SELE......
  • Struts2总结
    Struts2总结[code]一、Struts2概述Struts2其实并不是一个陌生的Web框架,Struts2是以Webwork的设计思想为核心,吸收了Struts1的优点,因此,可以认为Struts2是Struts1和Webwork结合的产物。一、MVC简介Struts2是一个兼容Struts1和WebWork的MVC框架,既然......
  • Jsp基础知识总结
    [code]首先来说一下我们jsp的课程:第一部分为Servlet技术,包括Servelt入门,会话跟踪,JavaMal和Servlet.第二部分就是Jsp技术,包括:jsp简介,jsp脚本和指令的使用,jsp隐式对象,JavaBean与jsp中的标准动作,jsp表达式语言,自定义标签,jsp自定义表签库.第三部......
  • Oracle 19c的参数sec_case_sensitive_logon与ORA-01017错误
    Oracle的参数sec_case_sensitive_logon是Oracle11g开始被引入。这个参数主要是为了控制密码的大小写敏感问题。sec_case_sensitive_logon=true表示密码区分大小写。sec_case_sensitive_logon=false表示密码不区分大小写。从Oracle12c开始,参数sec_case_sensitive_logon被弃用......
  • vi总结
    yy拷贝当前行nyy拷贝当前后开始的n行,比如2yy拷贝当前行及其下一行。p 在当前光标后粘贴,如果之前使用了yy命令来复制一行,那么就在当前行的下一行粘贴。shift+p在当前行前粘贴ndd剪切当前行之后的n行。利用p命令可以对剪切的内容进行粘贴......