1

次のスキーマを持つ表 Students があります。

CREATE TABLE STUDENTS
(
    SID    VARCHAR2(10 BYTE)    NOT NULL,
    SNAME  VARCHAR2(50 BYTE)    NOT NULL, . . .
)

リスト内の各項目に sid と sname が含まれる入力引数として生徒のリストを受け取るストアド プロシージャを作成したいと考えています。

入力パラメータの型とその定義方法は?

4

3 に答える 3

3

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

于 2011-12-19T09:44:51.753 に答える
1

カップルの 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 型の変数に値を挿入できます。

于 2011-12-19T10:04:51.650 に答える
0
   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;
于 2011-12-19T09:53:01.253 に答える