PLSQL

2016-04-14 41 views
2

prosedüründen kullanıcı tanımlı kaydı alma Sonunda çatladım.PLSQL

get_class_infor denilen college_package başka prosedür ekleyin: Burada okulumuzun görev. get_class_infor yordamı, kimliğini, eğitmen adını, kurs başlığını ve belirli bir sınıfının sınıfını almak ve döndürmek için kullanılır. CLASS_ID değerini bir IN parametresi olarak geçirin. Yordamdaki kayıt değişkenleri için kullanıcı tanımlı bir kayıt TYPE tanımlayın.

get_class_infor yordamını çağırmak için bir anonim bir blok oluşturun ve bir sınıf hakkındaki bilgileri görüntüleyin. Aşağıdaki örnek ben bir parametre göndermek ve kullanıcı tanımlı kaydını nasıl alınacağını anlaşılan emin olmak için bu anonim blok oluşturdu

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

01. sınıf kimliğini kullanır. Bu mükemmel çalışıyor.

ANONİM BLOK: sıkıştım

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; 

düzgün paket Spec/beden yaratan, ya da ben öyle varsayalım. Ne eksik olduğumu bilmiyorum. İşte sahip olduğum şey.

Paket özellikleri:

-- 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; 

AMBALAJ GÖVDE:

-- 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; 

anonim blok:

-- 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; 

er Ben olsun ror mesajdır:

ORA-06550: satır 12, sütun 4:
PLS-00306: yanlış numara ya da 'GET_CLASS_INFOR'
ORA-06550 çağrısına parametre tipleri: Satır 12, sütun 4:
PL/SQL: Bildirimi

Ben paket spec/vücudu kuruyorum biçiminde bir sorun var mı

gözardı? Cevabı kendim bulmak istiyorum, bu yüzden doğru yönde bir ipucu takdir edilecektir.

cevap

3

Paket özelliklerinde bir kayıt tipi tanımladınız. Bu, prosedürü çağırabileceğiniz gibi başka programlarda da kullanabileceğiniz anlamına gelir.

Ancak yaptığınız, anonim bloğunuzda ikinci bir kayıt türü olduğunu bildirmektir. Seninle aynı görünüyorlar çünkü aynı isimleri ve yapıları var. Fakat derleyiciye göre farklılar çünkü farklı şeyler. Prosedür, pakette tanımlanan kayıt tipini ister.

Yani düzeltme oldukça basittir:

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

Sadece 9 saat sonra ... biraz öldü ve onu haha ​​.. öylesine basitti. Bunu denedim ama 'CLASS_TYPE' tanımlayıcısını 'almalıyım' hatası alıyorum. Bildiride "class_type" den önce "college_package" eksik. Çok teşekkür ederim!! – Bryner

+1

@Bryner - Endişelenme: Kapsam belirleme kuralları inceliklidir ve herkesi gezdirebilir. Parlak tarafta, bu, sizi iyi bir şekilde durduracak isim alanlarının öneminde bir derstir. – APC