次のスキーマを持つ表 Students があります。
CREATE TABLE STUDENTS
(
SID VARCHAR2(10 BYTE) NOT NULL,
SNAME VARCHAR2(50 BYTE) NOT NULL, . . .
)
リスト内の各項目に sid と sname が含まれる入力引数として生徒のリストを受け取るストアド プロシージャを作成したいと考えています。
入力パラメータの型とその定義方法は?
次のスキーマを持つ表 Students があります。
CREATE TABLE STUDENTS
(
SID VARCHAR2(10 BYTE) NOT NULL,
SNAME VARCHAR2(50 BYTE) NOT NULL, . . .
)
リスト内の各項目に sid と sname が含まれる入力引数として生徒のリストを受け取るストアド プロシージャを作成したいと考えています。
入力パラメータの型とその定義方法は?
Oracle コレクション型をパラメーターとして渡すことができます。
コレクションは、varchar によってインデックス付けされた連想配列などのキーと値のペアである可能性があります。その例では、インデックスは SID であり、値は SNAME である可能性があります。
コレクションについては、こちらをお読みください: http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/05_colls.htm
特に連想配列についてはこちら: http://www.oracle-base.com/articles/9i/AssociativeArrays9i.php
または、2 つのパラメーターを渡すこともできます。どちらのコレクションも varchar 値 (DBMS_SQL.VARCHAR2_TABLE 型など) を保持し、最初のコレクションは SID を保持し、2 番目のコレクションは対応する SNAME 値を保持し、インデックス番号によって効果的にリンクされます。DBMS_SQL 定義型については、こちらを参照してください: http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sql.htm
それが役に立てば幸い...
編集:
パッケージ内ですべてのタイプを宣言し、すべてのアクションを実行する場合:
-- Declare type
TYPE student_coltype IS TABLE OF student%ROWTYPE
INDEX BY BINARY_INTEGER;
-- Declare variable of type
student_col student_coltype;
グローバル型が必要な場合は、列を明示的に宣言する必要があります。
CREATE TYPE student_rec
AS OBJECT
(SID VARCHAR2(10),
SNAME VARCHAR2(50));
CREATE TYPE student_collection
AS TABLE OF student_rec;
その後、学生のコレクション型を DB で使用して、学生のデータのコレクションをプロシージャや関数に出し入れできます。
Oracle オブジェクトを使用するためのドキュメントはこちら: http://docs.oracle.com/cd/B19306_01/appdev.102/b14260/adobjint.htm
カップルの SID、SNAME のタイプを作成できます。
CREATE OR REPLACE
TYPE O_STUDENT AS OBJECT (
SID VARCHAR2(20)
, SNAME VARCHAR2(20)
);
次に、コレクション タイプを作成します。
CREATE OR REPLACE
TYPE T_STUDENT AS TABLE OF O_STUDENT;
次に、プロシージャのパラメータの型として T_STUDENT を使用します。SQL INSERT ステートメントを使用して、T_STUDENT 型の変数に値を挿入できます。
create or replace procedure show_students is
begin
dbms_output.put_line('------------------------');
dbms_output.put_line('Student ID| Student Name|');
dbms_output.put_line('------------------------');
for i in( select * from students )
loop
dbms_output.put(i.sid||' |');
dbms_output.put(i.sname||' |');
end loop;
dbms_output.put_line('------------------------------');
end;
/
show errors;
set serveroutput on;
execute show_students;