PL/SQL 如何修复进程标志 id=4 错误打印以及如何显示错误消息

Posted

技术标签:

【中文标题】PL/SQL 如何修复进程标志 id=4 错误打印以及如何显示错误消息【英文标题】:PL/SQL how can ı fixed process flag id=4 wrong printing and how can I error message 【发布时间】:2021-07-06 05:31:40 【问题描述】:

创建表

create table curexample_test (id number, x number, y number, result number, process_flag varchar2(1), error_message varchar2(400))

insert into curexample_test
select 1, 20,4,null,null,null from dual
union
select 2, 15,3,null,null,null from dual
union
select 3, 36,9,null,null,null from dual
union
select 4, 7,0,null,null,null from dual
union
select 5, 105,15,null,null,null from dual

select * from curexample_test

创建函数

create or replace function divider(n1 in number, n2 in number)    
        return number    
            is     
            pragma autonomous_transaction;
            n3 number;    
         begin    
             
            if n2 = 0 then
               n3 :=null; 

                 update curexample_test set process_flag = 'E' where n3 = null ;
              
            else
                n3 :=n1 / n2; 
                 update curexample_test set process_flag = 'S' where n3 !=0 ;
        end if;
            COMMIT;
    return n3;    
        end;  

调用函数

select id,x,y , divider(x,y) as result,process_flag,error_message from curexample_test;

【问题讨论】:

【参考方案1】:

我们很少在函数中执行 DML;如果必须这样做,请使用程序。

从您的代码开始:

UPDATE 语句中的 WHERE 子句必须修复 如果要存储 RESULT,请同时修复 SET 子句 如果您将某些东西与NULL 进行比较,那么它不是例如where n3 = nullwhere n3 IS NULL
SQL> CREATE OR REPLACE FUNCTION divider (n1 IN NUMBER, n2 IN NUMBER)
  2     RETURN NUMBER
  3  IS
  4     PRAGMA AUTONOMOUS_TRANSACTION;
  5
  6     n3  NUMBER;
  7  BEGIN
  8     IF n2 = 0
  9     THEN
 10        n3 := NULL;
 11
 12        UPDATE curexample_test
 13           SET result = n3, process_flag = 'E'
 14         --WHERE n3 = NULL;
 15         WHERE     x = n1
 16               AND y = n2;
 17     ELSE
 18        n3 := n1 / n2;
 19
 20        UPDATE curexample_test
 21           SET result = n3, process_flag = 'S'
 22         -- WHERE n3 != 0;
 23         WHERE     x = n1
 24               AND y = n2;
 25     END IF;
 26
 27     COMMIT;
 28     RETURN n3;
 29  END;
 30  /

Function created.

测试:

SQL> SELECT id,
  2         x,
  3         y,
  4         divider (x, y) AS result,
  5         process_flag,
  6         error_message
  7    FROM curexample_test;

        ID          X          Y     RESULT PROCESS_FLAG    ERROR_MESSAGE
---------- ---------- ---------- ---------- --------------- --------------------
         1         20          4          5
         2         15          3          5
         3         36          9          4
         4          7          0
         5        105         15          7

然后是表格内容

SQL> select * from curexample_test;

        ID          X          Y     RESULT PROCESS_FLAG    ERROR_MESSAGE
---------- ---------- ---------- ---------- --------------- --------------------
         1         20          4          5 S
         2         15          3          5 S
         3         36          9          4 S
         4          7          0            E
         5        105         15          7 S

SQL>

【讨论】:

还有我如何为 id=4 添加错误消息 在不成功的情况下,错误信息应该打印在表格的error_message字段中。 将它添加到 UPDATE 语句中,它的 SET 子句 - 就像 RESULT 或 PROCESS_FLAG。没有区别。 非常感谢,我猜是catch异常 你并没有像 IF 那样“捕捉”任何东西。

以上是关于PL/SQL 如何修复进程标志 id=4 错误打印以及如何显示错误消息的主要内容,如果未能解决你的问题,请参考以下文章

如何在pl-sql中修复此功能

如何修复 PL/SQL:ORA-00932:不一致的数据类型:预期的 CLOB 得到了 -

如何打印出非质数? PL/SQL [关闭]

编写一个 PL/SQL Proc 并在 proc 中调用一个函数。输入是productid。打印出订购产品 ID 的客户姓名

如何修复此 SELECT 语句中的错误 INTO 子句

PL/SQL 函数在执行时抛出进程内存错误