Как выполнить пакет с параметром - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть две таблицы:

students(student_id, first_name, last_name)
classes(classid, incharge_student_id)

Я написал пакет, который примет classid в качестве параметра, а затем напечатает student_id, first_name, last_name из таблицы учеников для каждой incharge_student_id таблицы классов

CREATE OR REPLACE PACKAGE pack1
AS
PROCEDURE show_info(c_id classes.classid%TYPE DEFAULT 1, show_info_recordset OUT SYS_REFCURSOR);

END pack1;
/
CREATE OR REPLACE PACKAGE BODY pack1
AS
    PROCEDURE show_info 
    (   
    c_id   NUMBER DEFAULT 1,
    show_info_recordset OUT SYS_REFCURSOR
    )
    IS
       v_first_name students.first_name%TYPE;
       v_last_name students.last_name%TYPE;
       v_students students.student_id%TYPE;
    BEGIN
       SELECT students.first_name, students.last_name, students.student_id
         INTO v_first_name, v_last_name, v_students
         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;
/

Я получаю предупреждающее сообщение

Package Body created with compilation errors.

Я очень плохо знаком с pl / sql и хочу знать, почему я получаю сообщение об ошибке, а затем также хочу знать, как я буду выполнятьпакет, который имеет параметр.

Я знаю, как выполнить обычный пакет:

variable x refcursor;
exec package_name.procedure_name ( :x );
print x;

Но как мне выполнить мой пакет выше с параметром

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Удалите IN после имени переменной, и вам нужно запустить PROCEDURE, а не пакет, а также, почему вы определяете процедуру, в вашем случае лучше сделать так, чтобы она функционировала

0 голосов
/ 28 ноября 2018

В вашем коде есть несколько ошибок, см. Ниже:

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, поэтомуне будет ничего печатать.

0 голосов
/ 27 ноября 2018

Если вы используете SQL * Plus, выполните

SQL> show err

после компиляции пакета;он укажет вам на строку, которая вызывает ошибку.Например:

SQL> create or replace procedure p_test is
  2  begin
  3    select 1 from dual;
  4  end;
  5  /

Warning: Procedure created with compilation errors.

SQL> show err
Errors for PROCEDURE P_TEST:

LINE/COL ERROR
-------- -----------------------------------------------------------------
3/3      PLS-00428: an INTO clause is expected in this SELECT statement
SQL>

Если вы используете графический интерфейс, он, вероятно, содержит вкладку «Ошибки», которую вы можете просмотреть (и получить ту же информацию).

Как при вызове процедуры с параметрами: просто включите их, например

variable x refcursor;
exec package_name.procedure_name (100, :x );
print x;                           ^
                                   |
                                  this is the first procedure's parameter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...