【问题标题】:PL/SQL Oracle Stored Procedure (No Data Found)PL/SQL Oracle 存储过程(未找到数据)
【发布时间】:2016-04-03 11:55:12
【问题描述】:

代码

 -- 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' 的记录吗?
  • 您需要处理 NO_DATA_FOUND 和 TOO_MANY 异常。或者确保 SELECT INTO 始终有一个匹配的行。
  • 嗨@PZNevill,你的例外在哪里?看这个答案stackoverflow.com/questions/1256112/…
  • @Andy K 我现在将查看该答案。谢谢。
  • 请记住,如果您的查询返回 15 行,那么无论如何您都会收到 TOO MANY ROWS 异常。目前,您的代码仅在您的查询带回一行时才有效。如前所述,您需要将查询包装在异常块中或使用显式 CURSOR 来解决此问题。

标签: plsql oracle11g oracle-sqldeveloper


【解决方案1】:

从上面的 cmets 中,我想我们可以推断出P_JOB_TYPEJOB_TYPE 数据对于您在数据库中的预期行的大小写有所不同,因此为什么将lower() 应用于谓词的两侧开始恢复数据。

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

【讨论】:

    猜你喜欢
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2017-04-13
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多