oracle学习笔记(4)-游标

本文详细介绍了Oracle中的游标概念及使用方法,包括显式游标和隐式游标的定义、打开、检索和关闭等操作,并提供了多个实际应用案例。
CURSOR是oracle系统在内存中开辟的一块工作区,其中存放select语句返回的查询结果;
使用游标时,select记过可以是任意条记录;
游标工作去中存在着一个指针(POINTER),默认指向第一条记录;


游标的类型:
显示游标:用户定义,用于处理select语句返回的多条记录;
隐式游标:系统自动进行操作,用于处理DML和返回一条记录的select语句;

定义游标:
CURSOR cursor_name IS select_statement;
说明
游标必须在PL/SQL块的声明部分进行定义;
游标定义时可以引用PL/SQL变量,但变量必须在游标定义之前定义;
定义游标时并没有生成数据,只是将定义信息保存到数据字典中;
游标定义后,可以使用cursor_name%ROWTYPE定义游标类型变量.
打开游标:
OPEN cursor_name;
说明:
检查变量的值
执行游标定义时对应的SELECT语句,将查询结果检索到工作区中。
游标指针指向第一个元组
一旦游标打开,就无法再次打开,除非先关闭
如果游标定义中的变量值发生变化,则只能在下次打开游标时才起作用。
检索游标:
FETCH cursor_name INTO variable_list|record_variable,
说明
在使用FETCH语句之前必须先打开游标
对游标第一次使用FETCH语句时,游标指针指向第一条记录,因此操作的对象是第一条记录,使用后,游标指针指向下一条记录。
游标指针只能向下移动,不能回退
INTO子句中的变量个数、顺序、数据类型必须与工作区中每行记录的字段数、顺序以及数据类型一一对应
关闭游标:
CLOSE cursor_name;
例子:根据输入的部门号查询某个部门的员工信息,部门号在程序运行时指定:

DECLARE
	v_deptno emp.deptno%TYPE;
	CURSOR c_emp IS SELECT * FROM emp WHERE deptno=v_deptno;
	v_emp c_emp%ROWTYPE;
BEGIN
        v_deptno:=&x;
    OPEN c_emp;
    LOOP
    FETCH c_emp INTO v_emp;
    EXIT WHEN c_emp%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(v_emp.empno||' '|| v_emp.ename||' '||  v_emp.sal ||'  '||  v_deptno);                                   
    END LOOP; 
    CLOSE c_emp;
END; 	
显示游标的属性:
%ISOPEN
布尔型。如果游标已经打开,返回TRUE,否则为FALSE。
%FOUND
布尔型,如果最近一次使用FETCH语句,有返回结果则为TRUE,否则为FALSE;
%NOTFOUND
布尔型,如果最近一次使用FETCH语句,没有返回结果则为TRUE,否则为FALSE;
%ROWCOUNT
数值型,返回到目前为止从游标缓冲区检索的元组数。
%BULK_ROWCOUNT(i)
数值型,用于取得FORALL语句执行批绑定操作时第i个元素所影响的行数。
循环检索游标:
利用简单循环检索游标
DECLARE
CURSOR cursor_name IS SELECT…;
BEGIN
   OPEN cursor_name;
   LOOP
  FETCH…INTO…;
EXIT WHEN cursor_name%NOTFOUND;
……
   END LOOP;
   CLOSE cursor_name;
END; 
注意:EXIT WHEN子句应该是FETCH…INTO语句的下一条语句.
例子:输出各部门的平均工资;
DECLARE
    CURSOR cursor_dept IS select AVG(sal) deptno,avg_sal from emp group by deptno;
     v_dept cursor_dept%ROWTYPE;
BEGIN
    OPEN cursor_dept;
    LOOP
    FETCH cursor_dept INTO v_dept;
        EXIT WHEN cursor_dept%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(v_dept.avg_sal || '' || v_dept.deptno);
    END LOOP;
    CLOSE cursor_dept;
END;




利用WHILE循环检索游标
DECLARE
CURSOR cursor_name IS SELECT…;
BEGIN
OPEN cursor_name;
FETCH…INTO…;
WHILE cursor_name%FOUND LOOP
FETCH…INTO…;
……
END LOOP;
CLOSE cursor;
END;
注意:在循环体外进行一次FETCH操作,作为第一次循环的条件。
例子:输出部门的平均工资;
DECLARE
    CURSOR cursor_dept IS select AVG(sal) deptno,avg_sal from emp group by deptno;
    v_dept cursor_dept%ROWTYPE;
BEGIN
    OPEN cursor_dept;
    FETCH cursor_dept INTO v_dept;
    WHILE cursor_dept%FOUND LOOP
        DBMS_OUTPUT.PUT_LINE(v_dept.avg_sal || ' ' || v_dept.deptno);
        FETCH cursor_dept INTO v_dept;
    END LOOP;
    CLOSE cursor_dept;
END;
利用FOR循环检索游标
DECLARE
CURSOR cursor_name IS SELECT…;
BEGIN
FOR loop_variable IN cursor_name LOOP
  ……
END LOOP;
END; 
由于用FOR循环检索游标时,游标的打开、数据的检索、是否检索到数据的判断以及游标的关闭都是自动进行的,因此,可以不在声明部分定义游标,而在FOR语句中直接使用子查询。
例子:输出部门号位10的员工姓名;
BEGIN
    FOR v_emp IN (select * from emp where deptno=10) 
    LOOP
        DBMS_OUTPUT.PUT_LINE(v_emp.empno||' '||  v_emp.ename);
    END LOOP;
END;
利用游标更新或删除数据:
CURSOR cursor_name IS
SELECT select_list_item FROM table  FOR UPDATE
[OF column_reference] [NOWAIT]; 
打开游标时对相应的表加锁(通常SELECT操作不在数据上设置任何锁),其他用户不能对该表进行DML操作;
若数据对象已经被其他会话加锁,则当前会话挂起等待(默认状态),若指定了NOWAIT子句,则不等待,返回ORACLE错误。
对于多表查询时,可以通过OF子句指定某个要加锁的表的列的形式,对特定的表加锁,而其他表不加锁;否则所有表都加锁。 
当用户执行COMMIT或ROLLBACK操作时,数据上的锁会自动被释放。

例子:修改员工的工资,如果员工的部门号为10,则工资提高100;如果部门号为20,则工资提高150;如果部门号为30,则工资提高200;否则工资提高250。 

DECLARE
    CURSOR c_emp IS SELECT * FROM emp FOR UPDATE;-----------
    v_increment NUMBER;
BEGIN
    FOR v_emp IN c_emp LOOP
        CASE v_emp.deptno 
        WHEN 10 THEN v_increment:=100;
        WHEN 20 THEN v_increment:=150;
        WHEN 30 THEN v_increment:=200;
        ELSE         v_increment:=250;
        END CASE;
        UPDATE emp SET sal=sal+v_increment WHERE CURRENT OF c_emp;-----------
    END LOOP;
    COMMIT;
END; 

3GPP无线通信协议集(中文版45份文件) cwts-reports-001系统连接模式下的层间过程.doc cwts-reports-002系统空闲模式下UE过程与连接.doc cwts-reports-002系统空闲模式下UE过程与连接模式下小区重选过程.doc cwts-reports-003无线资源管理 (RRM) 策略.doc cwts-reports-004系统无线资源管理策略.doc cwts-reports-005系统UE无线接入能力.doc cwts-specs-001名词术语.doc cwts-specs-002系统无线接口物理层技术规范:概述.doc cwts-specs-003物理信道和传输信道到物理信道的映射.doc cwts-specs-004复用与信道编码.doc cwts-specs-005扩频与调制.doc cwts-specs-006物理层过程.doc cwts-specs-007物理层测量.doc cwts-specs-008物理层提供的服务.doc cwts-specs-009MAC.doc cwts-specs-010RLC.doc cwts-specs-011PDCP.doc cwts-specs-012广播多点传送控制BMC.doc cwts-specs-013-RRC331.doc cwts-specs-014系统Iu接口技术规范-概述.doc cwts-specs-015系统Iu接口技术规范-层1.doc cwts-specs-016系统Iu接口技术规范:信令传输.doc cwts-specs-017无线接入网络应用部分(RANAP).doc cwts-specs-018Iu接口技术规范-数据传输及传输信令.doc cwts-specs-019用户平面协议.doc cwts-specs-020系统Iub接口技术规范.doc cwts-specs-021系统Iub接口技术规范:层1.doc cwts-specs-022信令传输.doc cwts-specs-023NBAP信令.doc cwts-specs-024用于公共传输信道数据流的数据传输和传输信令.doc cwts-specs-025用于公共传输信道数据流的用户平面协议.doc cwts-specs-026系统Iur接口技术规范:概述.doc cwts-specs-027层1.doc cwts-specs-028信令传输.doc cwts-specs-029RNSAP信令.doc cwts-specs-030用于公共传送信道数据流的数据传输和传输信令.doc cwts-specs-031用于公共传送信道数据流的用户平面协议.doc cwts-specs-032系统IubIur接口技术规范.doc cwts-specs-033系统Iub-Iur接口技术规范.doc cwts-specs-034.doc cwts-specs-036TD-SCDMA-RRC.doc cwts-specs-037.doc cwts-specs-038.doc cwts-specs-039.doc
ATE ATL ATM ATP ATQ ATT ATV ATX ATZ AT&C AT&D AT&F AT&S AT&Z AT&M AT&V AT&W AT+CIMI AT+COPS AT+CFUN AT+CPIN AT+CSQ AT+CPINR AT+CESQ AT+CGDCONT AT+CGDSCONT AT+CGTFT AT+CGATT AT+CGACT AT+CGDATA AT+CGREG AT+CEREG AT+CGCONTRDP AT+CGEQOSRDP AT*DIALMODE AT*AUTOAPN AT*CGDFLT AT+EPIN AT+MSTK AT+MEDCR AT*BAND AT*BANDRD AT*REGOPT AT*AU THReq AT*CGDFAUTH AT$MYFOTA AT*SELECTSIMSLOT AT+SINGLESIM ATO AT+CGMI AT+CGMM AT+CGMR AT+CGSN AT+CSCS AT+WS46 AT+DS AT+GMI AT+GMM AT+GMR AT+GSN AT+GOI AT+GCAP AT+GCI AT+ICF AT+IFC AT+IDSR AT+ASTO ATA ATD ATH AT+CSTA AT+CMOD AT+CVMOD AT+CHUP AT+CBST AT+CRLP AT+CEER AT+CRC AT+CVHU AT+CNUM AT+CREG AT+CLCK AT+CPWD AT+CLIP AT+CLIR AT+COLP AT+CDIP AT+CCFC AT+CCWA AT+CUSD AT+CHLD AT+CAOC AT+CSSN AT+CLCC AT+CPOL AT+CPLS AT+COPN AT+CNAP AT+COLR AT+CSSAC AT+CNEM AT+CPSMS AT+CEDRXS AT+CEDRXRDP AT+CCIOTOPT AT+CPAS AT+CIND AT+CPBS AT+CPBR AT+CPBF AT+CPBW AT*CPBC AT+CCLK AT+CSIM AT+CRSM AT+CACM AT+CAMM AT+CPUC AT+CCWE AT+CLAC AT+CTZU AT+CTZR AT+CGLA AT+CRLA AT+CCHO AT+CCHC AT+CUAD AT+CGPIAF AT+CISRVCC AT+CIREP AT+CEN AT+CAVIMS AT+CPNER AT+CIREG AT+CASIMS AT+CMEE AT+CGQREQ AT+CGQMIN AT+CGEQREQ AT+CGEQMIN AT+CGCMOD AT+CGPADDR AT+CGCLASS AT+CGEREP AT+CGSMS AT+CGSCONTRDP AT+CGTFTRDP AT+CGEQOS AT+CEMODE AT+CSCON AT+CIPCA AT+CNMPSD AT+CEUS AT+CEVDP AT+CMMIVT AT+CABTSR AT+CABTRDP AT+CGAPNRC AT+CDU AT+FCLASS AT+VTS AT+VTD AT+CSUEPOLICY AT+CRUEPOLICY AT+C5GREG AT+C5GQOS AT+C5GNSSAI AT+C5GPNSSAI AT+C5GNSSAIRDP AT*APPSTART AT*SETUEOSID AT*UTTEST AT+C5GCAPA AT+CWUS AT+CLADN AT+CMICO AT*overheat AT*voltagefreq AT*CDNID AT*CAG AT+C5GUSMS AT+C5GURSPQRY AT+Z5GTD AT*TSNCTRL AT+CSMS AT+CPMS AT+CMGF AT+CSMP AT+CSDH AT+CSCB AT+CSAS AT+CRES AT+CNMI AT+CMGL AT+CMGR AT+CMGS AT+CMSS AT+CMGW AT+CSCA AT+CNMA AT+CMGD AT+CMGC AT+CMMS AT AT*SLT AT*PMICREG AT*REGRW AT*RFTEMP AT*RFTEMPEX AT*SSGLPC AT*MORESMS AT*MRD_CDF AT*MRD_IMEI AT*CalInfo AT*MRD_SN AT*L1DEBUG AT*DSPINFO AT+CMUX AT*READVER AT*READCPUUID AT+RESET AT+RSTSET AT+IPR AT+DNS AT$MYPOWEROFF AT$MYSOCKETLED AT$MYGMR AT$MYCCID AT$MYNETURC AT$MYTYPE AT$MYNETCON AT$MYNETACT AT$MYIPFILTER AT$MYNETSRV AT$MYNETOPEN AT$MYNETREAD AT$MYNETWRITE AT$MYNETCLOSE AT$MYNETACK AT$MYNETACCEPT AT$MYNETCREATE AT$MYBCCH AT$MYBAND AT$MYTIMEUPDATE AT$MYLACID AT$MYGPSPOS AT$MYGETKEY AT$MYSYSINFO AT$MYSYSINFOURC AT$MYDOWNLOAD AT^SPN AT+CPIN2 AT*EPIN AT*SIMDETEC AT*EUICC AT+CWRITESIM AT*CLCK AT*MEPCG AT*ENVSIM AT*CNMA AT*RSTMEMFULL AT+CMEMFULL AT*CSCB AT*CBMCS AT*CBRAT AT+CMRSS AT+CMGSS AT+CMSMS AT+CMGMS AT*CMGF AT^LKSMSSTA AT+EEMOPT AT+EEMGINFO AT*PROD AT*POSFUN AT+ATDB AT*TGSINK AT+CGSEND AT*ICSSINK AT+VPDUS AT+VHDL AT+VECHO AT+VDUMP AT*COMMTR AT+LTEPOWER AT*LTETR AT*GSMTR AT*CISCC AT*CIIND AT*IMSSRV AT*POCCMD AT*PRXYSET AT*PRXYRSP AT*CHAPAUTH AT*WIFICTRL AT*NETACT AT*NETREF AT*NETDNS AT*NETIF AT*NETIFCM AT*MPSAPN AT*COMCFG AT*IMLCONFIG AT*ENVCFG AT+ECHUPVT AT$VTS AT*DIALE AT*ECCLIST AT*IMSSRV AT*POCCMD AT*PRXYSET AT*PRXYRSP AT*CHAPAUTH AT*WIFICTRL AT*NETACT AT*NETREF AT*NETDNS AT*NETIF AT*NETIFCM AT*MPSAPN AT*COMCFG AT*IMLCONFIG AT*ENVCFG AT+ECHUPVT AT$VTS AT*DIALE AT*ECCLIST AT*CSCS AT*CCIREG AT^CACAP AT+GETIP AT*NVMFLUSH AT+PEER AT*REJCAUSE AT*CFUN AT*CTZR AT*ADMINDATA AT+CGCI AT+CGOI AT*BANDIND AT*POWERIND AT*FASTDORM AT*CELL AT*BLACKCELL AT+ERGA AT+ERTCA AT*FILETEST AT*CGSN AT*MODEMRESET AT*HTCCTO AT*EHSDPA AT*FDY AT^SYSINFO AT*NASCHK AT+BGLTEPLMN AT*GATR AT*GRIP AT*CGMR AT*CGATT AT*LTECOEX AT*CSQ AT+CPLMNS AT*URSLCT AT*SECCAP AT+OPERCFG AT*PSDC AT+MPBK AT+TRUSTNUM AT+CHKTRUSTNUM AT*FDNBYPASS AT+LOG AT*LWIPCTRL AT*NTP AT*MTU AT*ISIMAID AT^HVER AT+ZDON AT*ASRCOPS AT*ICCID AT*SIMPOLL AT*REGMODE AT+CELLINFO AT*VER AT+PACSP AT*GETIP AT*ROAMINGDATA AT*AUTOTZ AT*DNSCFG AT+AOPS AT+AOPSCFG AT+MSCLASS AT*DELFBPLMN AT*COMFEATURE AT*RESENDPARA AT+CMER AT*CSCO AT+APQUIT AT+wifi AT+sdiophase AT+MIFIMAC AT+FUNC AT+MIFISSID AT+WIFIMIXEDKEY AT+WIFIFUN AT+FLASHBP AT*MRD_SECOND_SN AT+GETCHIPUID AT*VIRTUALICCID AT+UEICCID 以上是我通过AT+CLAC指令返回的信息,给我整理下每个指令的含义
最新发布
12-14
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值