В вашем коде есть несколько ошибок, см. Ниже:
CREATE OR REPLACE PACKAGE pack1
AS
PROCEDURE show_info(c_id classes.classid%TYPE, show_info_recordset OUT SYS_REFCURSOR);
END pack1;
/
CREATE OR REPLACE PACKAGE BODY pack1
AS
PROCEDURE show_info
(
c_id NUMBER DEFAULT -1,
Спецификация параметра c_id в теле не соответствует спецификации в спецификации.Измените его на c_id classes.classid%type default 1
и добавьте квалификатор default 1
в спецификацию над скважиной.
show_info_recordset OUT SYS_REFCURSOR
)
IS
v_first_name IN students.first_name%TYPE;
v_last_name IN students.last_name%TYPE;
v_students IN students.student_id%TYPE;
Удалите ключевые слова "IN" в объявлениях переменных.Он используется только для объявлений параметров.
BEGIN
SELECT students.first_name, students.last_name, students.student_id
INTO v_first_name, v_last_name, v_students.student_id
Ссылка v_students в вас в предложение, а не v_students.student_id
FROM students, classes
WHERE (classes.classid = c_id AND classes.incharge_student_id=students.student_id;);
У вас есть лишняя точка с запятой (;
) внутри закрывающей скобки.Удалите его.
DBMS_OUTPUT.PUT_LINE('Class ID: ' || c_id);
DBMS_OUTPUT.PUT_LINE('FIRST NAME: ' || v_first_name);
DBMS_OUTPUT.PUT_LINE('LAST NAME: ' || v_last_name);
DBMS_OUTPUT.PUT_LINE('student_id: ' || v_students);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Class ID: ' || c_id || ' not found.');
END;
END pack1;
/
Чтобы выполнить этот код, вам просто нужно передать дополнительный параметр или использовать именованные параметры, как указано в @Littlefoot, хотя вы не назначаете курсор для параметра out, поэтомуне будет ничего печатать.