资源描述:
《存储过程,函数,游标》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、存储过程,函数,游标一、游标游标是一种PL/SQL控制结构,可以对SQL语句的处理进行显式控制,便于对表的数据逐条进行处理。ps.当表中数据量大的时候,不建议使用游标(效率不高,耗费资源),但是它能逐条取数据方法灵活。游标是记录的指针,利用游标对活动集的更新或删除会反馈到表的记录上。游标属性:%FOUND、%NOTFOUND、%ROWCOUNT、%ISOPEN1、显式游标显式游标是由用户显式声明的游标。根据在游标中定义的查询,查询返回的行集可以包含零或多行,这些行称为活动集。游标将指向活动集中的当
2、前行。显式游标操纵过程:声明、打开、从游标中获取记录、关闭。SETSERVEROUTPUTON;DECLARECURSORcurISSELECT*FROMbooks;myrecordbooks%ROWTYPE;BEGINOPENcur;LOOPFETCHcurINTObooks;EXITWHENcur%NOTFOUND;DBMS_OUTPUT.PUT_LINE(books.id
3、
4、''
5、
6、books.name);ENDLOOP;CLOSEcur;END;1.1、带参数的显式游标:参数不需指定长度或
7、者精度。1.2、FOR循环游标:采用遍历方式,自动打开、提取和关闭游标。(能否利用%ROWCOUNT获得游标提取的行数?)DECLARE/*定义带参数游标*/CURSORcur_para(idvarchar2)ISSELECTbooks_nameFROMbooksWHEREbooks_id=id;BGEIN/*调用带参数游标,并以FOR循环方式处理*/FORcurINcur_para('0001')LOOPDBMS_OUTPUT.PUT_LINE(cur.books_id
8、
9、''
10、
11、cur.boo
12、ks_id);ENDLOOP;END;1.3、使用显示游标删除或更新记录定义时:需使用SELECT...FORUPDATE语句表示事物的锁定;执行时:需使用WHERECURRENTOFcurXXX子句指定游标的当前行。/*定义部分*/CURSORcurISSELECTnameFROMdeptmentFORUPDATE;..../*执行部分*/UPDATEdeptmentSETname=name
13、
14、'_tt'WHERECURRENTOFcur;2、隐式游标不需声明,打开和关闭的游标。PL/SQL为所
15、有的SQL数据操纵语句隐式声明游标,它是不能直接命名和控制。BEGINFROMcurIN(SELECTnameFROMdeptment)LOOPDBMS_OUTPUT.PUT_LINE(cur.books_id
16、
17、''
18、
19、cur.books_id);ENDLOOP;END;ps.匿名块:每次执行时都需要被编译,并且无法存储到数据库中,别的PL/SQL块也无法调用它。命名块:存储在数据库中,属于数据库对象。排错:SHOWERRORSPROCEDURE/FUNCTION/PACKAGEobj_name
20、;二、存储过程CREATEORREPLACEPROCEDUREtest(valueINvarchar2,value2OUTNUMBER)/*参数,不需指定长度或精度*/IS/*局部变量,省略DECLARE关键字,需有长度*/identityNUMBER;BEGINSELECTITEMRATEINTOidentityFROMitemFileWHEREitemcode=value;IFidentity<200THENvalue2:=200;ELSEvalue2:=50;ENDIF;END;●匿名块执行
21、过程DECLAREtvalue2NUMBER;BEGINtest('i202',tvalue2);DBMS_OUTPUT.PUT_LINE('value2的值为:'
22、
23、TO_CHAR(value2));END;●单独执行EXECUTEmyproc('0001');三、函数函数的主要特性是它必须返回一个值。创建函数时通过RETURN子句指定函数返回值的数据类型。函数的一些限制:●函数只能带有IN参数,不能带有INOUT或OUT参数。●形式参数必须只使用数据库类型,不能使用PL/SQL类型。●函数的返
24、回类型必须是数据库类型。CREATEORREPLACEFUNCTIONitem_price_rage(priceNUMBER)/*参数、指定返回类型*/RETURNvarchar2AS/*定义局部变量*/min_priceNUMBER;max_priceNUMBER;BEGINSELECTMAX(ITEMRATE),MIN(ITEMRATE)INTOmax_price,min_priceFROMitemfile;IFprice>=min_priceANDprice<=max_pri