我终于破解了。下面是我们学校的分配:从程序PLSQL中检索用户定义的记录
添加另一个程序的college_package称为get_class_infor。 get_class_infor过程用于获取并返回类 id,教师姓名,课程名称和部门的特定 类。将CLASS_ID作为IN参数传递。为过程中的记录变量定义用户定义的记录 TYPE。
创建一个匿名块来调用get_class_infor过程并显示 有关类的信息。下面的示例使用类ID 01.
** Class id: 1
** Instructor: Gunther Haas
** Course Title: Algebra I
** Department: Mathematics
我创造了这个匿名块,以确保我明白如何发送参数和检索用户定义的记录。这工作非常好。
匿名块:
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;
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;
匿名块:
-- 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:语句被忽略
是不是有什么毛病我怎么创建包投机/身体?我想自己找到答案,所以向正确的方向暗示将不胜感激。
我刚死一点点... 9小时后,它是如此简单..哈哈。我试过,但我得到'标识符'CLASS_TYPE'必须声明'错误。我在声明中的'class_type'之前缺少'college_package'。非常感谢!! – Bryner
@Bryner - 不用担心:范围规则很微妙,可以让任何人都感受到。在光明的一面,这是名称空间的重要性的一个教训,它将会使你站得住脚。 – APC