よんちゅBlog

― このブログは自分用のメモや日々の問題などを共有するためのものです ―

20121005185841 お知らせ:  2013/07/17 ブログデザインをリニューアルしました。

PL/SQL配列渡し

パッケージ部

CREATE OR REPLACE PACKAGE ARRAY_TEST
IS

TYPE testtype IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER;
PROCEDURE get_test(para1 IN testtype, para2 OUT NUMBER);

END;
/

パッケージボディ部

CREATE OR REPLACE PACKAGE BODY ARRAY_TEST
IS

PROCEDURE get_test(para1 IN testtype, para2 OUT NUMBER)
IS
   
BEGIN

para2 := para1.COUNT;

END get_test;
END;
/

単に、配列のサイズを返すだけ

SQL*Plusで実行

DECLARE
    para1 ARRAY_TEST.testtype;
    para2 NUMBER;
BEGIN
    para1(1) := 'AA';
    para1(2) := 'BB';
    para1(3) := 'CC';

    ARRAY_TEST.get_test(para1,para2);
    DBMS_OUTPUT.PUT_LINE(para2);
END;
/

ここで若干詰まったのが、para1に型について
一度パッケージで宣言した型をもう一度宣言しないといけないのかと思っていたが、しなくていいみたい。
(この部分「TYPE testtest IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER;」)

むしろ、宣言してpara1の引数の型にした場合、
パッケージ部の型とSQL*Plusで宣言した型は違うものと判断されるので、
引数の方が正しくありませんみたいなエラーがでる。