好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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

查看更多关于Oracle存储过程、包、方法使用总结(推荐)的详细内容...

  阅读:27次