数据库之【存储过程篇】

******************************

数据库之【存储过程篇】

******************************

--熟悉SQL SERVER的人,都会用这样的方法来创建存储过程:(查询ADMIN表的信息)
CREATE PROCEDURE PRO_SEL_ALL
AS
SELECT * FROM ADMIN;

--由于在ORACLE中没有一个类型去接受一个结果集,而在SQL SERVER中却是由数据库系统自动返回结果集,
--然后显示。故如果我们用类似上面的方法来创建,如下:
CREATE OR REPLACE PROCEDURE PRO_SEL_ALL AS
BEGIN
  SELECT * FROM ADMIN;
END PROCEDURE PRO_SEL_ALL;
--则会报错:WARNING: PROCEDURE CREATED WITH COMPILATION ERRORS.

--那么在解决这个问题的时候有两个方法可以选择,第一种就是用游标来返回结果集合。
CREATE OR REPLACE PROCEDURE PRO_SEL_ALL IS
  CURSOR CUR_SEL_ALL IS
    SELECT ID, NAME, PASS FROM STUDENT; --定义游标
  C_ID   ADMIN.ID%TYPE; --声明变量分别保存STUDENT的各列
  C_NAME ADMIN.NAME%TYPE;
  C_PASS ADMIN.PASS%TYPE;
BEGIN
  OPEN CUR_SEL_ALL;
  LOOP
    --循环取数,并将游标数据填充到返回纪录集合中
    FETCH CUR_SEL_ALL
      INTO C_ID, C_NAME, C_PASS;
    EXIT WHEN CUR_SEL_ALL%NOTFOUND; --循环退出条件
  
    IF CUR_SEL_ALL%FOUND THEN
      --打印数据
      DBMS_OUTPUT.PUT_LINE(C_ID || ' ' || C_NAME || ' ' || C_PASS);
    END IF;
  END LOOP;
  CLOSE CUR_SEL_ALL;
END;
/
EXEC PRO_SEL_ALL; --执行存储过程

--我们也可以要用包(PACKAGE)来完成。在包的说明部分中声明游标和存储过程,在包体中给出存储过程。
--则上面的存储过程,写为:
CREATE OR REPLACE PACKAGE PACK_ SEL_ALL --创建包的说明部分
 AS
  TYPE MYCURSOR IS REF CURSOR; --声明游标MYCURSOR;
  PROCEDURE PRO_SEL_ALL(CURP OUT MYCURSOR); --声明存储过程PRO_SEL_ALL;
END PACK_SEL_ALL;
/

CREATE OR REPLACE PACKAGE BODY PACK_SEL_ALL --创建包体部分
IS
PROCEDURE PRO_SEL_ALL(CURP OUT CURSOR) --CURP为游标类型的输出参数
BEGIN
OPEN CURP FOR --将ADMIN表中的信息存放到CURP中去
SELECT * FROM STUDENT;
END PRO_SEL_ALL;
END PACK_SEL_ALL;
/
--计算当前年,某个月中有多少天,ORACLE中写存储过程:
CREATE OR REPLACE PROCEDURE CAULDCOUNT(M IN INTEGER) IS
  C VARCHAR2(3);
BEGIN
  SELECT TO_CHAR(LAST_DAY(TO_DATE(TO_CHAR(SYSDATE, 'YYYY') || '-' || M ||
                                  '-01',
                                  'YYYY-MM-DD')),
                 'DD')
    INTO C
    FROM DUAL;
  DBMS_OUTPUT.PUT_LINE(C);
END;

--调用:
SET SERVEROUTPUT ON;
EXECUTE CAULDCOUNT(4);
--------------------------
30
PL/SQL 过程已成功完成。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章