我有这个问题,我正在尝试解决,并在下面找到我到目前为止已解决的问题。虽然存储过程没有错误,但是调用它却出现此错误:
错误:第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
最后,应在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;
从下面的注释中收集,用于执行该过程的代码:
BEGIN
pub_Job_Count;
End;
您的程序需要输入数字。
但是当您打电话时,您没有提供该号码。
因此,数据库不高兴并发出此消息:
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程序外部进行交流的好方法。