« Mac De Oracle : PL/SQL de Collection #2 | トップページ | Mac De Oracle : PL/SQL de Collection #4 »

2007年5月27日 (日)

Mac De Oracle : PL/SQL de Collection #3

前回の続き

各コレクションの初期化の方法は見えたと思うので、今回は実際に要素をセットしたり取り出したりして遊んでみる。
最初にも書いたが今回セットするのはオブジェクト型。emp表をempno順に問い合せ、empType型として各コレクションの要素としてある。)

マニュアルなどを見ながらいろいろ試してみたほうが面白いと思うので特に解説はしません。。Enjoy!!

CREATE OR REPLACE
PROCEDURE COLLECTIONS AS
TYPE VarrayType IS VARRAY(100) OF empType;
TYPE NestedTableType IS TABLE OF empType;
TYPE StrAssociativeArrayType IS TABLE OF empType INDEX BY VARCHAR2(50);
TYPE NumAssociativeArrayType IS TABLE OF empType INDEX BY BINARY_INTEGER;

myVarray VarrayType := VarrayType();
myNestedTable NestedTableType := NestedTableType();
myStrAssociativeArray StrAssociativeArrayType;
myNumAssociativeArray NumAssociativeArrayType;

myEmp empType;
strIdx VARCHAR2(50);
numIdx PLS_INTEGER;

CURSOR csrEmp IS
SELECT
job,
empno,
ename,
hiredate,
sal,
deptno
FROM
emp
ORDER BY
empno;


BEGIN
FOR emp_rec IN csrEmp LOOP
myEmp := empType (
emp_rec.empno,
emp_rec.ename,
emp_rec.job,
emp_rec.hiredate,
emp_rec.sal,
emp_rec.deptno
);
myVarray.EXTEND(1);
myVarray(myVarray.COUNT) := myEmp;
myNestedTable.EXTEND(1);
myNestedTable(myNestedTable.COUNT) := myEmp;
myStrAssociativeArray(TO_CHAR(myEmp.empno) || ':' || myEmp.ename) := myEmp;
myNumAssociativeArray(myEmp.empno) := myEmp;
END LOOP;

DBMS_OUTPUT.PUT_LINE('**** VARRAY ****');
FOR j IN myVarray.FIRST..myVarray.LAST LOOP
DBMS_OUTPUT.PUT_LINE(
'myVarray(' || TO_CHAR(j) || ')=' || myVarray(j).TO_STRING()
);
END LOOP;

DBMS_OUTPUT.NEW_LINE();
DBMS_OUTPUT.PUT_LINE('**** NESTED TABLE ****');
FOR j IN myNestedTable.FIRST..myNestedTable.LAST LOOP
DBMS_OUTPUT.PUT_LINE(
'myNestedTable(' || TO_CHAR(j) || ')=' || myNestedTable(j).TO_STRING()
);
END LOOP;

DBMS_OUTPUT.NEW_LINE();
DBMS_OUTPUT.PUT_LINE('**** Associative Array (String) ****');
strIdx := myStrAssociativeArray.FIRST();
WHILE strIdx IS NOT NULL LOOP
DBMS_OUTPUT.PUT_LINE(
'myStrAssociativeArray(' || strIdx || ')=' || myStrAssociativeArray(strIdx).TO_STRING()
);
strIdx := myStrAssociativeArray.NEXT(strIdx);
END LOOP;

DBMS_OUTPUT.NEW_LINE();
DBMS_OUTPUT.PUT_LINE('**** Associative Array (Number) ****');
numIdx := myNumAssociativeArray.FIRST();
WHILE numIdx IS NOT NULL LOOP
DBMS_OUTPUT.PUT_LINE(
'myNumAssociativeArray(' || TO_CHAR(numIdx) || ')=' || myNumAssociativeArray(numIdx).TO_STRING()
);
numIdx := myNumAssociativeArray.NEXT(numIdx);
END LOOP;
END;
/

以下、SQL*Plusでの実行結果。
尚、SQL*Plusのset serveroutputコマンドのオプション format wrappedは覚えておくといいですよ。
このオプションの意味も特に解説はしません。 format wrappedがある場合と無い場合の違いはご自分で確認してみてください


SCOTT> set serveroutput on size 10000 format wrapped
SCOTT> exec collections;

**** VARRAY ****
myVarray(1)=7369,SMITH,CLERK,1980/12/17, 800.00,20
myVarray(2)=7499,ALLEN,SALESMAN,1981/02/20, 1600.00,30
myVarray(3)=7521,WARD,SALESMAN,1981/02/22, 1250.00,30
myVarray(4)=7566,JONES,MANAGER,1981/04/02, 2975.00,20
myVarray(5)=7654,MARTIN,SALESMAN,1981/09/28, 1250.00,30
myVarray(6)=7698,BLAKE,MANAGER,1981/05/01, 2850.00,30
myVarray(7)=7782,CLARK,MANAGER,1981/06/09, 2450.00,10
myVarray(8)=7788,SCOTT,ANALYST,1987/04/19, 3000.00,20
myVarray(9)=7839,KING,PRESIDENT,1981/11/17, 5000.00,10
myVarray(10)=7844,TURNER,SALESMAN,1981/09/08, 1500.00,30
myVarray(11)=7876,ADAMS,CLERK,1987/05/23, 1100.00,20
myVarray(12)=7900,JAMES,CLERK,1981/12/03, 950.00,30

**** NESTED TABLE ****
myNestedTable(1)=7369,SMITH,CLERK,1980/12/17, 800.00,20
myNestedTable(2)=7499,ALLEN,SALESMAN,1981/02/20, 1600.00,30
myNestedTable(3)=7521,WARD,SALESMAN,1981/02/22, 1250.00,30
myNestedTable(4)=7566,JONES,MANAGER,1981/04/02, 2975.00,20
myNestedTable(5)=7654,MARTIN,SALESMAN,1981/09/28, 1250.00,30
myNestedTable(6)=7698,BLAKE,MANAGER,1981/05/01, 2850.00,30
myNestedTable(7)=7782,CLARK,MANAGER,1981/06/09, 2450.00,10
myNestedTable(8)=7788,SCOTT,ANALYST,1987/04/19, 3000.00,20
myNestedTable(9)=7839,KING,PRESIDENT,1981/11/17, 5000.00,10
myNestedTable(10)=7844,TURNER,SALESMAN,1981/09/08, 1500.00,30
myNestedTable(11)=7876,ADAMS,CLERK,1987/05/23, 1100.00,20
myNestedTable(12)=7900,JAMES,CLERK,1981/12/03, 950.00,30

**** Associative Array (String) ****
myStrAssociativeArray(7369:SMITH)=7369,SMITH,CLERK,1980/12/17, 800.00,20
myStrAssociativeArray(7499:ALLEN)=7499,ALLEN,SALESMAN,1981/02/20, 1600.00,30
myStrAssociativeArray(7521:WARD)=7521,WARD,SALESMAN,1981/02/22, 1250.00,30
myStrAssociativeArray(7566:JONES)=7566,JONES,MANAGER,1981/04/02, 2975.00,20
myStrAssociativeArray(7654:MARTIN)=7654,MARTIN,SALESMAN,1981/09/28, 1250.00,30
myStrAssociativeArray(7698:BLAKE)=7698,BLAKE,MANAGER,1981/05/01, 2850.00,30
myStrAssociativeArray(7782:CLARK)=7782,CLARK,MANAGER,1981/06/09, 2450.00,10
myStrAssociativeArray(7788:SCOTT)=7788,SCOTT,ANALYST,1987/04/19, 3000.00,20
myStrAssociativeArray(7839:KING)=7839,KING,PRESIDENT,1981/11/17, 5000.00,10
myStrAssociativeArray(7844:TURNER)=7844,TURNER,SALESMAN,1981/09/08, 1500.00,30
myStrAssociativeArray(7876:ADAMS)=7876,ADAMS,CLERK,1987/05/23, 1100.00,20
myStrAssociativeArray(7900:JAMES)=7900,JAMES,CLERK,1981/12/03, 950.00,30

**** Associative Array (Number) ****
myNumAssociativeArray(7369)=7369,SMITH,CLERK,1980/12/17, 800.00,20
myNumAssociativeArray(7499)=7499,ALLEN,SALESMAN,1981/02/20, 1600.00,30
myNumAssociativeArray(7521)=7521,WARD,SALESMAN,1981/02/22, 1250.00,30
myNumAssociativeArray(7566)=7566,JONES,MANAGER,1981/04/02, 2975.00,20
myNumAssociativeArray(7654)=7654,MARTIN,SALESMAN,1981/09/28, 1250.00,30
myNumAssociativeArray(7698)=7698,BLAKE,MANAGER,1981/05/01, 2850.00,30
myNumAssociativeArray(7782)=7782,CLARK,MANAGER,1981/06/09, 2450.00,10
myNumAssociativeArray(7788)=7788,SCOTT,ANALYST,1987/04/19, 3000.00,20
myNumAssociativeArray(7839)=7839,KING,PRESIDENT,1981/11/17, 5000.00,10
myNumAssociativeArray(7844)=7844,TURNER,SALESMAN,1981/09/08, 1500.00,30
myNumAssociativeArray(7876)=7876,ADAMS,CLERK,1987/05/23, 1100.00,20
myNumAssociativeArray(7900)=7900,JAMES,CLERK,1981/12/03, 950.00,30

PL/SQLプロシージャが正常に完了しました。

SCOTT>

以下のスクリーンショットは、Oracle SQL Developerで上記プロシージャを作成、テストしているところ。
Collection3_sdev

今日はここまで。

|

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/106341/15220958

この記事へのトラックバック一覧です: Mac De Oracle : PL/SQL de Collection #3:

コメント

コメントを書く