Oracle存储过程、包、方法使用总结(推荐)

时间:2021-12-09 04:21:30

Oracle存储过程、包、方法使用总结,具体代码如示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/**
 *@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存储过程、包、方法使用总结(推荐),希望对大家有所帮助,如果大家有所疑问欢迎给我留言,小编会及时回复大家的!

原文链接:http://www.cnblogs.com/beyondzw/archive/2017/04/28/6780852.html