Oracle 存储过程不工作 PLS-00306

Posted

技术标签:

【中文标题】Oracle 存储过程不工作 PLS-00306【英文标题】:Oracle stored procedure not working PLS-00306 【发布时间】:2020-03-11 23:16:59 【问题描述】:

我有这个问题,我正在尝试解决并在下面找到我迄今为止解决的问题。虽然存储过程没有错误但调用它我得到这个错误:

第 2 行出现错误:ORA-06550:第 2 行第 3 列:PLS-00306:错误 调用“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 异常应该在 EXCEPTION 部分和屏幕上显示的消息(提示:使用 Oracle 提供的 DBMS_OUTPUT.put_line 过程)通知用户 如果出现这样的错误。请注意,为了 DBMS_OUTPUT.put_line 要在 SQL*Plus 中工作,您应该首先设置 SERVEROUTPUT。你应该 通过调用过程检查过程是否正确执行 检查 PublisherDetails 表的内容。请执行下列操作: a) 使用创建表所需的代码创建一个脚本文件 PublisherDetails 和数据库中的 PL/SQL 过程; b) 创建一个 第二个脚本文件,包含以下内容: • 清除 SQL 语句 PublisherDetails 表的内容; • PL/SQL 匿名块 调用(执行)PL/SQL 过程的语句; • 一个选择 语句选择 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;

从下面的 cmets 中收集到,用于执行该过程的代码:

BEGIN
 pub_Job_Count;
End;

【问题讨论】:

您展示了除了最重要的部分之外的所有内容 - 您的代码用于调用 PUB_JOB_COUNT。这就是错误的来源。 您好,调用我的存储过程的代码是:BEGIN pub_Job_Count;结束; 那是你的问题,你需要给它一个号码,jobNo 根据你的程序定义 【参考方案1】:

你的程序需要一个输入,一个数字。

但是当你打电话给它时,你并没有提供所说的号码。

因此,数据库变得异常并发出以下问题:

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

一个基本的例子

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

如果我运行这个 -

如果您取消注释前几行,您会看到 PLS-00306 重新出现。

最后一点,关于 DBMS_OUTPUT。这是在“调试”代码时查看正在发生的事情的好方法,但不是在 PL/SQL 程序之外进行交流的好方法。

【讨论】:

请注意,这显然是一项家庭作业......我选择回答您最紧迫的问题 - 为什么您无法运行您的程序。您需要自己进行代码审查,看看它是否符合您教授的要求。 大家好,非常感谢,但我已将代码编辑为“创建或替换过程 PUB_JOB_COUNT AS”,因为我不想输入数字来获得我的结果。但是当我运行它时,我收到错误“ORA-06511: PL/SQL: cursor already open ......ORA-06512: at DB LINE 5 AND LINE 13 这是一个新问题...否则您要求我们修复您的整个程序,您需要提出一个明确的问题/问题。

以上是关于Oracle 存储过程不工作 PLS-00306的主要内容,如果未能解决你的问题,请参考以下文章

PLS-00306:调用“*”时参数的数量或类型错误

PLS-00306:调用 oracle 函数时参数的数量或类型错误

Oracle并发编程执行方法

PLS-00306:调用过程 PROC_T 时参数的数量或类型错误

PLS-00306:错误调用中的参数数量或类型错误

PLS-00306:调用“ADD_MONTHS”时参数的数量或类型错误