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

Plsql PL/SQL Oracle存储过程(未找到数据),plsql,oracle11g,oracle-sqldeveloper,Plsql,Oracle11g,Oracle Sqldeveloper,代码 -- 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_TITL

代码

 -- 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;
代码

 -- 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。这可能是问题所在吗?如果是这样,我如何修复它,使变量读起来像管理器一样。多谢各位


正如@Drumberg所指出的,我实际上拉了太多的记录,但即使在修复SQL以选择单个记录之后,我仍然收到相同的错误。数据库本身可能有问题吗

从上面的评论中,我想我们可以推断出
p\u JOB\u TYPE
和数据库中预期行的
JOB\u TYPE
数据之间的大小写不同,因此为什么对谓词的两侧应用
lower()
会开始返回数据


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

您对
JOBS
表的查询没有返回任何数据。您确定存在
作业标题为
'Manager'
的记录吗?您需要处理未找到的数据和太多的异常。或者确保您始终有一个匹配的行用于选择进入。Hi@PZNevill,您的例外情况在哪里?看看这个答案@Andy K我现在就看这个答案。谢谢。请记住,如果您的查询返回15行,您将得到一个太多行的异常。目前,只有当您的查询返回恰好一行时,您的代码才能工作。如前所述,您需要将查询包装在异常块中,或者使用显式的
游标
,以绕过此问题。