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
侧)。
代码
-- 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
侧)。