Oracle хранимая процедура не работает PLS-00306 - PullRequest
0 голосов
/ 12 марта 2020

У меня есть вопросы, которые я пытаюсь решить, и найдите ниже то, что я решил до сих пор. хотя хранимая процедура не имеет ошибки, но вызывая ее, я получаю эту ошибку:

ОШИБКА в строке 2: ORA-06550: строка 2, столбец 3: PLS-00306: неверное число или типы аргументов в вызове to 'PUB_JOB_COUNT' ORA-06550: строка 2, столбец 3: PL / SQL: оператор игнорируется

Требование:

Создать сохраненный PL / SQL процедура объекта в базе данных. В процедуре должны быть указаны имя издателя, город, номер телефона и количество (количество) запрошенных им заданий в таблице PublisherDetails для каждого издателя, который запросил менее трех заданий на печать, в противном случае процедура должна отобразить на экране имя издателя по номеру работы, дате начала работы и дате завершения работы для каждой работы, которую он / она запрашивал. Вывод экрана (подсказка: используйте оператор конкатенации '||') должен быть в следующем формате:

Пожалуйста, кто-нибудь поможет мне, пожалуйста?

Имя издателя: Addison-Wesley

       JobNo    Start Date       Completion Date
         12       17-JAN-14         25-JAN-14
         14       28-FEB-14         01-APR-14

Наконец, в разделе ИСКЛЮЧЕНИЕ должно учитываться исключение NO-DATA-FOUND, а на экране должно отображаться сообщение (подсказка: используйте процедуру DBMS_OUTPUT.put_line, предоставленную Oracle), информирующее пользователь, если такая ошибка возникает. Обратите внимание, что для того, чтобы DBMS_OUTPUT.put_line работал в SQL* Plus, сначала необходимо установить SERVEROUTPUT. Вы должны проверить, правильно ли выполняется процедура, вызвав ее и проверив содержимое таблицы PublisherDetails. Выполните следующие действия: a) Создайте файл сценария с необходимым кодом для создания таблицы PublisherDetails и процедуры PL / SQL в базе данных; б) Создайте второй файл сценария со следующим: • оператор SQL, который очищает содержимое таблицы PublisherDetails; • оператор анонимного блока PL / SQL для вызова (выполнения) процедуры PL / SQL; • Оператор SELECT для выбора всех записей в таблице PublisherDetails.

мои таблицы

publisher(publisherName, publisherCity, phoneNo)
             pk

printJob(JobNo, startDate, complitionDate, publisherName)
           pk                                fk(publisher)

publisherdetails(publisherName, publisherCity, phoneNo, JobNo)          
                     pk

Код:

CREATE OR REPLACE PROCEDURE PUB_JOB_COUNT (
       JOBNO IN NUMBER
) AS
       PUBLISHERNAME  PRINTJOB.PUBLISHERNAME%TYPE;
       NOTFOUND EXCEPTION;
       CURSOR PUBCURSOR IS
       SELECT PUBLISHER.PUBLISHERNAME,
              PUBLISHER.PUBLISHERCITY,
              PUBLISHER.PHONENO,
              PRINTJOB.STARTDATE,
              PRINTJOB.COMPLETIONDATE,
              SUM(JOBNO) AS NUMOFJOBS
         FROM PUBLISHER
        INNER JOIN PRINTJOB ON PUBLISHER.PUBLISHERNAME = PRINTJOB.PUBLISHERNAME
        GROUP BY PUBLISHER.PUBLISHERNAME,
                 PUBLISHER.PUBLISHERCITY,
                 PUBLISHER.PHONENO,
                 PRINTJOB.STARTDATE,
                 PRINTJOB.COMPLETIONDATE;
       PUBREC         PUBCURSOR%ROWTYPE;
BEGIN
       OPEN PUBCURSOR;
       FOR PRINTJOB IN PUBCURSOR LOOP
              PUBLISHERNAME := PRINTJOB.PUBLISHERNAME;
              DBMS_OUTPUT.PUT_LINE('Publisher Name : ' || PRINTJOB.PUBLISHERNAME);
              LOOP
                     FETCH PUBCURSOR INTO PUBREC;
                     EXIT WHEN PUBCURSOR%NOTFOUND;
                     IF PUBREC.NUMOFJOBS <= 3 THEN INSERT INTO PUBLISHERDETAILS VALUES (
                            PUBREC.PUBLISHERNAME,
                            PUBREC.PUBLISHERCITY,
                            PUBREC.PHONENO,
                            PUBREC.NUMOFJOBS
                     );
                     ELSE DBMS_OUTPUT.PUT_LINE(PUBREC.NUMOFJOBS
                                               || ' '
                                               || PUBREC.STARTDATE
                                               || ' '
                                               || PUBREC.COMPLETIONDATE);
                     END IF;
              END LOOP;
       END LOOP;
       CLOSE PUBCURSOR;
       COMMIT;
EXCEPTION
       WHEN NOTFOUND THEN DBMS_OUTPUT.PUT_LINE('Record Not Found');
END;

На основании приведенных ниже комментариев код, используемый для выполнения процедуры:

BEGIN
 pub_Job_Count;
End;

1 Ответ

0 голосов
/ 12 марта 2020

Ваша программа ожидает ввода, число.

Но когда вы звоните, вы не предоставляете указанный номер.

Итак, база данных расстроена и выдает следующее:

PLS-00306: wrong number or types of arguments in call to 'PUB_JOB_COUNT' 

Чтобы исправить это,

BEGIN
 pub_Job_Count(1); -- your number is added here, either explicitley or via a variable you add in a DECLARE
END;
/

Основа c пример

clear screen

create or replace procedure so_missing_inputs (x in integer, y in date) is
begin
 dbms_output.put_line('X is: ' || x);
 dbms_output.put_line('Y is: ' || to_char(y, 'MM-DD-YYYY HH24:MI:SS'));
end;
/

set serveroutput on

declare
 a integer := 2;
 b date := sysdate;

begin
-- so_missing_inputs(); -- missing 2 inputes
-- so_missing_inputs(1); -- missing 1 inputs
-- so_missing_inputs(sysdate, 2); -- right number of inputs, but not right data types
 so_missing_inputs(x => a, y => b); -- let's be explicit about inputs vs coutning on right order
end;
/

Если я запусту это -

enter image description here

Если бы вы раскомментировали одну из предыдущих строк, вы бы увидели, как PLS-00306 возвращается обратно.

Последнее замечание по DBMS_OUTPUT. Это хороший способ увидеть, что происходит во время «отладки» вашего кода, но это не хороший способ сообщать о вещах вне программы PL / SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...