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行,您将得到一个太多行的异常。目前,只有当您的查询返回恰好一行时,您的代码才能工作。如前所述,您需要将查询包装在异常块中,或者使用显式的游标
,以绕过此问题。