2016-04-14 15 views
2

私はついにひどくひどくなりました。プロシージャPLSQLからユーザ定義レコードを取得

get_class_infor 呼ばcollege_packageに、別の手順を追加します。ここでは私たちの学校の割り当てです。 get_class_inforプロシージャは、特定の クラスのID、インストラクタ名、コースタイトル、および部門 をフェッチして返します。 CLASS_IDをINパラメータとして渡します。プロシージャー内のレコード変数にユーザー定義レコード TYPEを定義します。

get_class_inforプロシージャを呼び出し、クラスに関する情報を と表示する匿名ブロックを作成します。次の例では、私は確信して私は、パラメータを送信し、ユーザー定義のレコードを取得する方法を理解するには、この無名ブロックを作成した01

** Class id:  1 
** Instructor: Gunther Haas 
** Course Title: Algebra I 
** Department: Mathematics 

クラスIDを使用しています。これは完全に正常に動作します。

ANONYMOUS BLOCK:

DECLARE 
    TYPE class_type IS RECORD (
    class_id classes.class_id%TYPE, 
    i_first instructors.first_name%TYPE, 
    i_last instructors.last_name%TYPE, 
    course courses.title%TYPE, 
    dept  sections.title%TYPE 
    ); 
    p_rec class_type; 
    PROCEDURE get_class_infor(
     p_id IN NUMBER, 
     p_rec OUT class_type 
    ) IS 
    BEGIN 
     SELECT cl.class_id, i.first_name, i.last_name, cr.title, s.title 
     INTO p_rec 
     FROM classes cl 
     JOIN instructors i ON cl.instr_id = i.instructor_id 
     JOIN courses cr ON cl.course_id = cr.course_id 
     JOIN sections s ON cr.section_code = s.section_code 
     WHERE class_id = p_id; 
    END get_class_infor; 
BEGIN 
    get_class_infor(:class_id, p_rec); 
    DBMS_OUTPUT.PUT_LINE('** Class id:  ' || p_rec.class_id); 
    DBMS_OUTPUT.PUT_LINE('** Instructor: ' || p_rec.i_first || ' ' || p_rec.i_last); 
    DBMS_OUTPUT.PUT_LINE('** Course Title: ' || p_rec.course); 
    DBMS_OUTPUT.PUT_LINE('** Department: ' || p_rec.dept); 
END; 

私はこだわって適切にパッケージ仕様/体を作成している、またはそう私が想定しています。私は何が欠けているのか分からない。ここに私が持っているものがあります。

パッケージ仕様:

-- Example 4_2A 
CREATE OR REPLACE PACKAGE college_package IS 
    TYPE class_type IS RECORD (
    class_id classes.class_id%TYPE, 
    i_first instructors.first_name%TYPE, 
    i_last instructors.last_name%TYPE, 
    course courses.title%TYPE, 
    dept  sections.title%TYPE 
); 
    PROCEDURE get_class_infor (
    p_id IN NUMBER, 
    p_rec OUT class_type 
); 
END college_package; 

パッケージBODY:

-- Example 4_2B 
CREATE OR REPLACE PACKAGE BODY college_package IS 
    PROCEDURE get_class_infor (
    p_id IN NUMBER, 
    p_rec OUT class_type 
) IS 
    BEGIN 
    SELECT cl.class_id, i.first_name, i.last_name, cr.title, s.title 
    INTO p_rec 
    FROM classes cl 
     JOIN instructors i ON cl.instr_id = i.instructor_id 
     JOIN courses cr  ON cl.course_id = cr.course_id 
     JOIN sections s  ON cr.section_code = s.section_code 
     WHERE class_id = p_id; 
    END; 
END college_package; 

ANONYMOUS BLOCK:

-- Example 4_2C 
DECLARE 
    TYPE class_type IS RECORD (
    class_id classes.class_id%TYPE, 
    i_first instructors.first_name%TYPE, 
    i_last instructors.last_name%TYPE, 
    course courses.title%TYPE, 
    dept  sections.title%TYPE 
); 
    v_rec class_type; 
BEGIN 
    college_package.get_class_infor(:class_id, v_rec); 
    DBMS_OUTPUT.PUT_LINE('** Class id:  ' || v_rec.class_id); 
    DBMS_OUTPUT.PUT_LINE('** Instructor: ' || v_rec.i_first || ' ' || v_rec.i_last); 
    DBMS_OUTPUT.PUT_LINE('** Course Title: ' || v_rec.course); 
    DBMS_OUTPUT.PUT_LINE('** Department: ' || v_rec.dept); 
END; 

えー私が取得RORメッセージは次のとおりです。

ORA-06550:行12、列4:
PLS-00306:間違った番号または 'GET_CLASS_INFOR'
ORA-06550への呼び出しの引数のタイプ:行12、列4:
PL/SQL:

を無視声明は、私はパッケージ仕様/体を作成していますどのように何か問題はありますか?私は自分自身で答えを見つけたいので、正しい方向へのヒントが評価されます。

答えて

3

パッケージ仕様でレコードタイプを定義しました。これは、プロシージャを呼び出すことができるように、他のプログラムでも使用できることを意味します。

しかし、あなたのやったことは、匿名ブロックに2番目のレコードタイプを宣言することです。彼らは同じ名前と構造を持っているので、あなたに同じように見えます。しかし、コンパイラには違うものがあります。なぜなら、それらは異なるものだからです。このプロシージャでは、パッケージに定義されているレコードタイプが必要です。

ので、修正は非常に簡単です:

DECLARE 
    v_rec college_package.class_type; 
BEGIN 
    college_package.get_class_infor(:class_id, v_rec); 
    DBMS_OUTPUT.PUT_LINE('** Class id:  ' || v_rec.class_id); 
    DBMS_OUTPUT.PUT_LINE('** Instructor: ' || v_rec.i_first || ' ' || v_rec.i_last); 
    DBMS_OUTPUT.PUT_LINE('** Course Title: ' || v_rec.course); 
    DBMS_OUTPUT.PUT_LINE('** Department: ' || v_rec.dept); 
END; 
+0

私はちょっと... 9時間後に死亡し、それはとても簡単だった...(笑)。私はそれを試みたが、 'identifier 'CLASS_TYPE'が宣言されていなければならない'というエラーが出てきた。宣言の 'class_type'の前に' college_package'がありませんでした。どうもありがとうございます!! – Bryner

+1

@ブライナー - 心配する必要はありません。スコープのルールは微妙で、誰かを飛び越えることができます。明るい側では、これは良い代えにあなたを立てる名前空間の重要性の教訓です。 – APC

関連する問題