Oracleサンプル4ストレージ・プロシージャ
4293 ワード
ストレージ・プロシージャの使用例
CREATE TABLE EMPS
AS
SELECT * FROM EMP;
CREATE TABLE DEPTS
AS
SELECT * FROM DEPT;
SELECT * FROM EMPS;
SELECT * FROM DEPTS;
-- ---------------------
--1.
CREATE OR REPLACE PROCEDURE PROC_DEMO1
AS -- PL/SQL DECLARE
V_NAME EMPS.ENAME%TYPE;
V_SAL EMPS.SAL%TYPE;
V_DEPTNO EMPS.DEPTNO%TYPE;
V_AVGSAL NUMBER;
V_RESULT VARCHAR2(50);
CURSOR CUR_RESULT IS
SELECT ENAME,SAL,DEPTNO FROM EMPS;
BEGIN
OPEN CUR_RESULT;
LOOP
FETCH CUR_RESULT INTO V_NAME,V_SAL,V_DEPTNO;
EXIT WHEN CUR_RESULT%NOTFOUND; --
SELECT AVG(SAL) INTO V_AVGSAL FROM EMPS
WHERE DEPTNO = V_DEPTNO;
IF V_SAL>V_AVGSAL THEN
V_RESULT := ' ';
ELSIF V_SAL = V_AVGSAL THEN
V_RESULT := ' ';
ELSE
V_RESULT := ' ';
END IF;
DBMS_OUTPUT.PUT_LINE(V_NAME||':'||V_RESULT);
END LOOP;
CLOSE CUR_RESULT;
END PROC_DEMO1;
-- 1
--1). PL/SQL
BEGIN
SCOTT.PROC_DEMO1;
END;
--2).
-- scott debug
GRANT DEBUG CONNECT SESSION TO SCOTT;
--2.
CREATE SEQUENCE SEQ_DEPTS
START WITH 50
INCREMENT BY 10
SELECT * FROM USER_SEQUENCES;
CREATE OR REPLACE PROCEDURE PROC_DEMO2
( -- VARCAHR2
IN_NAME IN VARCHAR2,--
IN_LOC IN VARCHAR2 --
)
AS
--
BEGIN
--
INSERT INTO DEPTS VALUES(SEQ_DEPTS.NEXTVAL,IN_NAME,IN_LOC);
COMMIT;
END PROC_DEMO2;
--3.
CREATE OR REPLACE PROCEDURE PROC_DEMO3
(
IN_DEPTNO IN EMPS.DEPTNO%TYPE,
OUT_RESULT OUT NUMBER
)
AS
BEGIN
SELECT COUNT(*) INTO OUT_RESULT
FROM EMPS WHERE DEPTNO = IN_DEPTNO;
END PROC_DEMO3;
--4.
CREATE OR REPLACE PROCEDURE PROC_DEMO4
(
IN_ID IN NUMBER,
OUT_RESULT OUT SYS_REFCURSOR -- Cursor
-- Cursor Cursor
--
)
AS
BEGIN
OPEN OUT_RESULT FOR
SELECT E.ENAME,E.SAL FROM EMPS E
WHERE E.DEPTNO = IN_ID;
END PROC_DEMO4;
-- PROC_DEMO4
DECLARE
V_ID NUMBER :=20;
V_RESULT SYS_REFCURSOR;
V_ENAME VARCHAR2(50);
V_SAL NUMBER;
BEGIN
SCOTT.PROC_DEMO4(V_ID,V_RESULT);
LOOP
FETCH V_RESULT INTO V_ENAME,V_SAL;
EXIT WHEN V_RESULT%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(V_ENAME||' '||V_SAL);
END LOOP;
CLOSE V_RESULT;
END;
--5.
CREATE OR REPLACE PROCEDURE PROC_DEMO5
(
IN_INDEX IN NUMBER, -- currPageNo
IN_SIZE IN NUMBER, -- pageSize
OUT_RESULT OUT SYS_REFCURSOR,--
OUT_COUNT OUT NUMBER,--
IN_NAME IN VARCHAR2,
IN_START IN VARCHAR2,
IN_END IN VARCHAR2,
IN_DEPT IN NUMBER
)
AS
V_SQL VARCHAR2(500); --SQL
V_WHERE_SQL VARCHAR2(300); -- SQL
V_START_PAGE NUMBER;
V_END_PAGE NUMBER;
BEGIN
IF IN_NAME IS NOT NULL THEN
V_WHERE_SQL := ' AND ENAME LIKE ''%'||IN_NAME||'%'' ';
END IF;
IF IN_START IS NOT NULL AND IN_END IS NOT NULL THEN
V_WHERE_SQL :=V_WHERE_SQL||' AND HIREDATE BETWEEN TO_DATE('''||IN_START||''',''yyyy-mm-dd'') AND
TO_DATE('''||IN_END||''',''yyyy-mm-dd'') ';
END IF;
IF IN_DEPT > 0 THEN
V_WHERE_SQL := V_WHERE_SQL||' AND DEPTNO = '||IN_DEPT;
END IF;
V_SQL := 'SELECT COUNT(*) FROM EMPS WHERE 1=1 '|| V_WHERE_SQL;
EXECUTE IMMEDIATE V_SQL INTO OUT_COUNT; --
V_START_PAGE := (IN_INDEX-1)*IN_SIZE;
V_END_PAGE := IN_INDEX*IN_SIZE;
V_SQL := 'SELECT * FROM ( '||
' SELECT E.*,ROWNUM AS R FROM EMPS E WHERE 1=1 '||V_WHERE_SQL||
' ) WHERE R<=:1 AND R>:2 ';
OPEN OUT_RESULT FOR V_SQL USING V_END_PAGE,V_START_PAGE; -- USING
END PROC_DEMO5;
SELECT * FROM (
SELECT E.*,ROWNUM AS R FROM EMPS E WHERE 1=1
)
WHERE R<=5 AND R>0;
SELECT * FROM USER_PROCEDURES;--
DROP PROCEDURE PROC_DEMO1;--
DROP PROCEDURE PROC_DEMO2;--
DROP PROCEDURE PROC_DEMO3;--
DROP PROCEDURE PROC_DEMO4;--
DROP PROCEDURE PROC_DEMO5;--