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