sql - Oracle 存储过程不工作 PLS-00306
问题描述
我有这个问题,我正在尝试解决并在下面找到我迄今为止解决的问题。虽然存储过程没有错误但调用它我得到这个错误:
第 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 部分处理 NO-DATA-FOUND 异常,并在屏幕上显示一条消息(提示:使用 Oracle 提供的 DBMS_OUTPUT.put_line 过程)通知用户是否出现此类错误。请注意,为了使 DBMS_OUTPUT.put_line 在 SQL*Plus 中工作,您应该首先设置 SERVEROUTPUT。您应该通过调用过程并检查 PublisherDetails 表的内容来检查过程是否正确执行。执行以下操作: a) 使用必要的代码创建一个脚本文件,以在数据库中创建表 PublisherDetails 和 PL/SQL 过程;b) 使用以下内容创建第二个脚本文件: • 清除表 PublisherDetails 内容的 SQL 语句;• 用于调用(执行)PL/SQL 过程的PL/SQL 匿名块语句;
我的桌子
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 程序之外进行交流的好方法。
推荐阅读
- linux - 检查已经运行的进程是否在 Linux 上重定向了标准输入?
- javascript - Javascript未显示来自GET springboot rest api的通知
- nuget - 适用于 Windows 的 Cordova 应用程序,NuGet 无法获得正确版本的 System.Collections.Specialized
- mongodb - $project 和 $group 之间的实际区别是什么?
- nginx - Nginx HTTP 到 HTTPS 重定向仅适用于一个 server_name?
- javascript - Socket.io 在几秒钟后停止工作,很多 .emit()?
- javascript - 如何显示来自 API 的特定 JSON 数据
- php - 排除 preg_match_all/foreach 中被注释掉的链接
- node.js - 流利的ffmpeg如何将X11显示设置为输入
- python - 为什么python列表在使用=运算符时会这样