PL/SQL Oracle存储过程(无数据找到)

3

代码

 -- Stored Procedure 
 CREATE OR REPLACE PROCEDURE DEVELOPMENT_PROCEDURE 
 (
    P_JOB_TYPE IN JOBS.JOB_TITLE%type DEFAULT 'Manager'
  , P_JOB_ID OUT JOBS.JOB_ID%type
  , P_JOB_TITLE OUT JOBS.JOB_TITLE%type
 ) AS 
 BEGIN
   SELECT JOB_ID, JOB_TITLE
   INTO P_JOB_ID, P_JOB_TITLE
   FROM JOBS
   WHERE JOB_TITLE = P_JOB_TYPE;
 END DEVELOPMENT_PROCEDURE;

代码

-- Calling the Stored Procedure
DECLARE
  P_JOB_ID JOBS.JOB_ID%type;
  P_JOB_TITLE JOBS.JOB_TITLE%type;
  P_JOB_TYPE VARCHAR2(25) := 'Manager';
BEGIN
  DEVELOPMENT_PROCEDURE(P_JOB_TYPE,P_JOB_ID,P_JOB_TITLE);
  SYS.DBMS_OUTPUT.PUT_LINE(P_JOB_ID);
  SYS.DBMS_OUTPUT.PUT_LINE(P_JOB_TITLE);
END;

问题

这是我运行后收到的错误消息。我按照教程一字不差地操作,但仍然遇到错误;已经解决了大部分问题,但目前卡在这里。

ORA-01403: no data found
ORA-06512: at "HR.DEVELOPMENT_PROCEDURE", line 8
ORA-06512: at line 8

没有设置任何异常,但我应该看到15条记录。有什么想法吗?
这可能是声明的问题吗?我需要参数读取Manager而不是MANAGER。如果是这样,我该如何修复变量以读作Manager。谢谢。
正如@Drumbeg所指出的那样,我实际上拉取了太多的记录,但即使在修复SQL以选择单个记录后,我仍然收到同样的错误。可能存在数据库本身的问题吗?

你对 JOBS 表的查询没有返回任何数据。你确定存在 job_title'Manager' 的记录吗? - Drumbeg
2
你需要处理NO_DATA_FOUND和TOO_MANY异常。或者确保SELECT INTO始终有一行匹配。 - user2672165
1
@Andy K 我现在会查看那个答案。谢谢。 - PZNevill
1
请记住,如果您的查询返回了15行数据,无论如何都会得到“TOO MANY ROWS”异常。目前,您的代码只能在查询返回一行数据时才能正常工作。正如前面提到的,您需要在查询中添加一个异常块或使用CURSOR来解决这个问题。 - Drumbeg
@Drumbeg 啊!非常正确。谢谢。 - PZNevill
显示剩余11条评论
1个回答

1
从上面的评论中,我认为我们可以推断出在数据库中期望的行的P_JOB_TYPEJOB_TYPE数据之间存在大小写差异,因此将谓词两侧都应用lower()开始带回数据。

值得指出的是,在谓词两侧都应用lower()本身并不是一个好的解决方案,因为如果这不受函数索引支持,可能会有性能影响。最好确定您在数据库中存储的大小写,并仅对谓词的右侧(即P_JOB_TYPE一侧)应用upper()lower()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接