數據庫之【存儲過程篇】

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

數據庫之【存儲過程篇】

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

--熟悉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 過程已成功完成。




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