如何修复存储过程 Oracle PL/SQL 的错误?
Posted
技术标签:
【中文标题】如何修复存储过程 Oracle PL/SQL 的错误?【英文标题】:How could I fix error for Stored Procedure Oracle PL/SQL? 【发布时间】:2018-12-05 00:41:45 【问题描述】:我想解决这个问题:
创建一个名为 insert_num_proc 的存储过程,它将数字插入到 FLOAT_SAMPLE 表中。 此过程应该有两个参数,一个用于此表中的两列中的每一列。 该过程应检查 float_id 列以确保没有重复(因为此列中不强制执行唯一值)。如果 有重复的float_id,则该行不应该插入, 而是打印一条消息“float_id 中的重复值”。
以下是我的查询。对于第二个查询,我执行我的存储过程以查看它是否显示我的应用程序错误消息,并且它不工作。
CREATE OR REPLACE PROCEDURE insert_num_proc
(
float_id_param float_sample.float_id%TYPE,
float_value_param float_sample.float_value%TYPE)
AS
float_checker float_sample.float_id%TYPE;
BEGIN
SELECT float_id INTO float_checker FROM float_sample;
INSERT INTO float_sample (float_id, float_value)
VALUES
(float_id_param, float_value_param);
IF float_checker = float_id_param THEN
RAISE_APPLICATION_ERROR(-20001, 'Duplicate value is inserted.');
END IF;
END;
/
EXECUTE insert_num_proc(3,2);
以下是我收到的错误消息
错误报告 - ORA-01422:精确提取返回的数量超过请求的数量 行数 ORA-06512:在“DL29232.INSERT_NUM_PROC”,第 9 行 ORA-06512: 在第 1 行 01422. 00000 - “精确提取返回的行数超过了请求的行数” *原因:exact fetch 中指定的数字小于返回的行数。 *操作:重写查询或更改请求的行数
【问题讨论】:
运行代码时看到了什么?我们可以猜测,但您自己看看会很有启发性。 “它不工作”。您收到任何错误消息吗?日志?它做了什么你意想不到的事? 【参考方案1】:您缺少一个 WHERE
子句来检查该 id 是否存在,因此它返回单个静态变量 float_checker
无法容纳的多行。
另一个问题是,如果您的表中还没有条目,您的选择语句将失败并出现no_data_found
异常。
因此,请以不同方式定义您的 float_checker
,以便保存计数。
此外,您的 INSERT
应该在 IF
条件之后
CREATE OR REPLACE PROCEDURE insert_num_proc (
float_id_param float_sample.float_id%TYPE,
float_value_param float_sample.float_value%TYPE
) AS
float_checker INTEGER := 0;
BEGIN
SELECT COUNT(*)
INTO float_checker
FROM float_sample WHERE
float_id = float_id_param; --where clause for the passed id.
IF float_checker > 0
THEN
raise_application_error(-20001,'Duplicate value is inserted.');
END IF;
INSERT INTO float_sample (
float_id,
float_value
) VALUES (
float_id_param,
float_value_param
);
END;
/
由于这是一个练习,因此可以使用此代码。但是,在实时场景中,第 3 个需求应由桌面上的UNIQUE CONSTRAINT
处理。
【讨论】:
虽然该过程执行了所需的操作,但可能会出现错误消息“重复值 已插入”。不是很聪明,因为实际上并没有插入记录。最好提出“不允许重复值”之类的内容以上是关于如何修复存储过程 Oracle PL/SQL 的错误?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 R 调用存储在 Oracle 数据库中的 PL/SQL 过程
使用带有布尔输入参数的 PL/SQL 在 oracle 中调用 java 存储过程
oracle创建存储过程时,提示错误是:错误(5,18): PL/SQL: ORA-00947: 没有足够的值?代码如下: