如何修复存储过程 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 的错误?的主要内容,如果未能解决你的问题,请参考以下文章

oracle SQL语句中怎么样调用存储过程

如何从 R 调用存储在 Oracle 数据库中的 PL/SQL 过程

使用带有布尔输入参数的 PL/SQL 在 oracle 中调用 java 存储过程

oracle创建存储过程时,提示错误是:错误(5,18): PL/SQL: ORA-00947: 没有足够的值?代码如下:

Oracle 存储过程 Procedure

Java 存储过程是不是比 Oracle 中的 PL/SQL 慢?