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

PL/SQL Oracle Stored Procedure (No Data Found)

代码

 -- 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 修复为 select 单个记录后,我仍然收到相同的错误。数据库本身会不会有问题?

从上面的评论中,我认为我们可以推断出 P_JOB_TYPE 和数据库中预期行的 JOB_TYPE 数据之间存在差异,因此为什么应用 lower() 到谓词两边开始带回数据

值得指出的是,将 lower() 应用于谓词的两边本身并不是一个好的解决方案,因为如果功能索引不支持这可能会影响性能。可能更好地确定您存储在数据库中的情况,只需将 upper()lower() 应用于谓词的右侧(即 P_JOB_TYPE 侧)。