CREATE TABLE stuInfo (
stuID INT PRIMARY KEY,
stuName VARCHAR2(20)
);
CREATE OR REPLACE PROCEDURE proc1 IS
BEGIN
INSERT INTO stuInfo VALUES (1, 'liheng');
END proc1;
/
CREATE OR REPLACE PROCEDURE proc2 (
v_ID IN INT,
v_Name IN VARCHAR2
) IS
BEGIN
INSERT INTO stuInfo VALUES (v_ID, v_Name);
COMMIT;
END proc2;
/
CREATE OR REPLACE PROCEDURE proc3 (
v_ID IN INT,
v_Name OUT VARCHAR2
) IS
varName stuInfo.stuName%TYPE;
BEGIN
SELECT stuName INTO varName FROM stuInfo WHERE stuID = v_ID;
v_Name := varName;
END proc3;
/
規格部:
CREATE OR REPLACE PACKAGE PKG_STUINFO IS
TYPE stuInfoCursorType IS REF CURSOR;
PROCEDURE getStuInfo (stuInfoCursor OUT stuInfoCursorType);
END PKG_STUINFO;
/
實現部(返回全表):
CREATE OR REPLACE PACKAGE BODY PKG_STUINFO IS
PROCEDURE getStuInfo (stuInfoCursor OUT stuInfoCursorType) IS
var_cursor stuInfoCursorType;
BEGIN
OPEN var_cursor FOR SELECT * FROM stuInfo;
stuInfoCursor := var_cursor;
END getStuInfo;
END PKG_STUINFO;
/
CREATE OR REPLACE PACKAGE BODY PKG_STUINFO IS
PROCEDURE getStuInfo (v_ID IN INT, stuInfoCursor OUT stuInfoCursorType) IS
var_cursor stuInfoCursorType;
BEGIN
IF v_ID = 0 THEN
OPEN var_cursor FOR SELECT * FROM stuInfo;
ELSE
OPEN var_cursor FOR SELECT * FROM stuInfo WHERE stuID = v_ID;
END IF;
stuInfoCursor := var_cursor;
END getStuInfo;
END PKG_STUINFO;
/
CREATE OR REPLACE PACKAGE BODY PKG_STUINFO IS
PROCEDURE getStuInfo (v_Name IN VARCHAR2, stuInfoCursor OUT stuInfoCursorType) IS
var_cursor stuInfoCursorType;
BEGIN
IF v_Name = ' ' THEN
OPEN var_cursor FOR SELECT * FROM stuInfo;
ELSE
OPEN var_cursor FOR SELECT * FROM stuInfo WHERE stuName LIKE '%' || v_Name || '%';
END IF;
stuInfoCursor := var_cursor;
END getStuInfo;
END PKG_STUINFO;
/
-- SQL*Plus / PL/SQL Developer
VAR rc REFCURSOR
EXEC PKG_STUINFO.getStuInfo(0, :rc);
PRINT rc
EXEC PKG_STUINFO.getStuInfo('li', :rc);
PRINT rc
%TYPE 錨定類型,表結構變更自動適配。REF CURSOR 實現結果集跨邊界傳遞(Java/.NET/Python 皆可消費)。DBMS_SQL 或 OPEN ... FOR USING。