Oracle存储过程、包、方法使用总结(推荐)
数据库  /  管理员 发布于 6年前   132
Oracle存储过程、包、方法使用总结,具体代码如示:
/** *@author:zhengwei *@date:2017-04-28 *@desc:存储过程用法总结 */ CREATE OR REPLACE PROCEDURE MYPROCEDURE(P_ID IN VARCHAR, P_STATUS OUT VARCHAR) --P_ID为输入参数 ,P_STATUS为输出参数 AS ---变量声明 T_STATUS VARCHAR2(20); T_ID NUMBER; V_POSTYPE VARCHAR2(20); V_DESCRIPTION VARCHAR2(20); ---对象变量定义和声明 TYPE XRECORD IS RECORD( FUND VARCHAR2(50), BATCH_NO VARCHAR2(50), TRAN_AMT NUMBER, END_BAL NUMBER, TRAN_DATE VARCHAR2(50), TRAN_TIME VARCHAR2(50), SUB_WATER NUMBER); XWATER XRECORD; ---游标声明,并填充数据 CURSOR MY_CUR IS SELECT POS_TYPE, DESCRIPTION FROM VOTEMASTER;BEGIN ---变量赋值(注意:in类型的参数不能直接赋值) T_STATUS := '1'; P_STATUS := T_STATUS; DBMS_OUTPUT.put_line('P_STATUS:' || P_STATUS); BEGIN ---循环游标,使用游标 FOR V_ROW IN MY_CUR LOOP BEGIN V_POSTYPE := V_ROW.POS_TYPE; V_DESCRIPTION := V_ROW.DESCRIPTION; DBMS_OUTPUT.put_line('POSTYPE:' || V_POSTYPE || ',description:' || V_DESCRIPTION); END; END LOOP; END; ---WHILE循环用法 BEGIN WHILE i < 10 LOOP BEGIN i := i + 1; END; END LOOP; END; --将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND) BEGIN SELECT col1, col2 INTO 变量1, 变量2 FROM typestruct WHERE xxx; EXCEPTION WHEN NO_DATA_FOUND THEN xxxx; END; ---IF判断语句用法 BEGIN SELECT VOTETITLE, VATESUM INTO T_NAME, T_COUNT FROM VOTEMASTER WHERE ID = P_ID; IF T_COUNT <= 0 THEN P_STATUS := T_NAME || ':差'; ELSIF T_COUNT > 0 AND T_COUNT < 3 THEN P_STATUS := T_NAME || ':良好'; ELSE P_STATUS := T_NAME || ':优秀'; END IF; END; ---对象变量赋值 BEGIN SELECT FUND, BATCH_NO, TRAN_AMT, END_BAL, TRAN_DATE, TRAN_TIME, SUB_WATER INTO XRECORD FROM ACCT_WATER WHERE FUND = P_ID; --对象变量的使用 DBMS_OUTPUT.put_line(XRECORD.BATCH_NO || XRECORD.FUND); END; ---索引表 ---我们在使用存储过程的时候经常需要处理记录集,也就是多条数据记录。分为单列多行和多列多行,这些类型都可以称为集合类型。索引表就是集合类型中的一种。 ---索引表,也称为pl/sql表,不能存储于数据库中,元素的个数没有限制,下标可以为负值。 ---使用场景:如果仅仅是在存储过程中当作集合变量使用,索引表是最好的选择。(也可以通过创建临时表替代,但就不那么科学了,而且后期还得维护临时表) ---索引表对象使用方案1: BEGIN ---索引表对象声明、定义、使用 DECLARE TYPE acct_table_type IS TABLE OF ACCT%ROWTYPE INDEX BY BINARY_INTEGER; ---定义了一个索引表v_acct_table,其表中的每行记录是ACCT表中的一行记录 v_acct_table acct_table_type; BEGIN SELECT * BULK COLLECT ---BULK COLLECT INTO指是一个成批聚合类型, 简单的来说 , 它可以存储一个多行多列存储类型 INTO v_acct_table FROM ACCT WHERE acct_type = '570' AND ROWNUM < 5; FOR i IN 1 .. v_acct_table.COUNT LOOP DBMS_OUTPUT.put_line('ACCT:' || v_acct_table(i).fund || ',' || v_acct_table(i).bal || ',' || v_acct_table(i) .real_nmbr); END LOOP; END; END; ---索引表对象使用方案2: BEGIN --例子:利用记录RECORD可用整体赋值的特性来填充PL/SQL表 DECLARE TYPE RECTYPE IS RECORD( FUND ACCT.FUND%TYPE,, ---表示定义的变量的类型为表Acct的fund字段的同样数据类型 BAL ACCT.BAL%TYPE, OWNER ACCT.OWNER%TYPE, REAL_NMBR VARCHAR(30)); ---定义了一个索引表MYTAB,其表中的每行记录是RECORD TYPE TABTYPE IS TABLE OF RECTYPE INDEX BY BINARY_INTEGER; MYTAB TABTYPE; VN NUMBER; BEGIN --填充 VN := 1; FOR VARR IN (SELECT FUND, BAL, OWNER, REAL_NMBR FROM ACCT WHERE ROWNUM <= 15 ORDER BY FUND ASC) LOOP MYTAB(VN) := VARR; --记录整体赋值 VN := VN + 1; END LOOP; --访问 VN := MYTAB.FIRST; FOR VARR IN VN .. MYTAB.COUNT LOOP DBMS_OUTPUT.PUT_LINE(VN || ' ' || MYTAB(VN).FUND || ' ' || MYTAB(VN).BAL || ' ' || MYTAB(VN).OWNER || ' ' || MYTAB(VN) .REAL_NMBR); VN := MYTAB.NEXT(VN); END LOOP; END; END;
以上所述是小编给大家介绍的Oracle存储过程、包、方法使用总结(推荐),希望对大家有所帮助,如果大家有所疑问欢迎给我留言,小编会及时回复大家的!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号