******************************
数据库之【存储过程篇】
******************************
--熟悉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 过程已成功完成。