DB2 函数异常

DB2 FUNCTION EXCEPTION

提问人:Shivanesh Raghuraman 提问时间:1/6/2023 更新时间:1/6/2023 访问量:117

问:

我正在将 Oracle plsql 函数转换为 DB2 plsql 函数。下面我提到了 Oracle 和 DB2 查询的结构。

CREATE FUNCTION FUNCTION_NAME (IN PARAMETER1 DATATYPE)
                    Return varchar(4000) IS
                    N_COLUMN1 varchar(1);
                    N_COLUMN2 INT;
                    N_COLUMN3 VARCHAR(2000);
                    BEGIN 
                    SELECT A.COLUMN1,A.COLUMN2 INTO N_COLUMN1,N_COLUMN2 FROM TABLE A WHERE A.COLUMN1=PARAMETER1;
                    IF N_COLUMN1 = 'A' then  N_COLUMN3:= 'NEW_A';
                    ELSEIF N_COLUMN1 = 'B' then  N_COLUMN3:= 'NEW_B';
                    END IF;
                    exception when others then N_COLUMN3:= 'OTHERS'
                    RETURN N_COLUMN3;
                    END;
/

DB2 查询:

CREATE FUNCTION FUNCTION_NAME (IN PARAMETER1 DATATYPE)
                    Returns varchar(4000)
                    BEGIN 
                    declare N_COLUMN1 varchar(1);
                    declare N_COLUMN2 INT;
                    declare N_COLUMN3 VARCHAR(2000);
                    SELECT A.COLUMN1,A.COLUMN2 INTO N_COLUMN1,N_COLUMN2 FROM TABLE A WHERE A.COLUMN1=PARAMETER1;
                    IF N_COLUMN1 = 'A' then set N_COLUMN3= 'NEW_A';
                    ELSEIF N_COLUMN1 = 'B' then  set N_COLUMN3= 'NEW_B';
                    END IF;
                    exception when others then set N_COLUMN3= 'OTHERS'
                    RETURN N_COLUMN3;
                END;

我在异常部分遇到错误。我在互联网上搜索了一下,我得到了 DECLARE type HANDLER FOR SQLEXCEPTION,他们提供了这种语法,并在执行之前提到部分需要声明这个.我不确定我需要用什么词来代替类型,谁能帮我当其他人时异常的等价 DB2 语法是什么

SQL 异常 DB2

评论


答:

0赞 Mark Barinstein 1/6/2023 #1

这取决于在处理程序调用后要在代码中传递控件的位置。
查看处理程序声明说明。
下面是函数代码的可能示例。

CREATE FUNCTION FUNCTION_NAME 
(
  IN PARAMETER1 VARCHAR (1)
)
Returns varchar(4000)
BEGIN
  declare N_COLUMN1 varchar(1);
  declare N_COLUMN2 INT;
  declare N_COLUMN3 VARCHAR(2000);
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
      -- The last statement executed in the function 
      -- when the handler fires.
      -- The control is passed out of the function body
      -- since the handler is declared 
      -- in the main BEGIN END function block.
      RETURN 'OTHERS';
    END;
  
  SELECT A.COLUMN1,A.COLUMN2 
  INTO N_COLUMN1,N_COLUMN2 
  FROM 
  --TABLE A 
  (
    VALUES
      ('A', 0)
    , ('A', 0)
    , ('B', 0)
  ) A (COLUMN1, COLUMN2)
  WHERE A.COLUMN1=PARAMETER1;
  IF N_COLUMN1 = 'A' then 
    set N_COLUMN3 = 'NEW_A';
  ELSEIF N_COLUMN1 = 'B' then
    set N_COLUMN3 = 'NEW_B';
  END IF;
  --exception when others then set N_COLUMN3= 'OTHERS'
  RETURN N_COLUMN3;
END
SELECT P, FUNCTION_NAME (P) AS F
FROM (VALUES 'A', 'B') T (P)
P F
一个 别人
B NEW_B

小提琴

评论

0赞 Shivanesh Raghuraman 1/6/2023
我对结果有点怀疑,如果 P 值是 A,那么 F 值如何是“其他”,它可能是“NEW_A”?
0赞 Mark Barinstein 1/6/2023
在此示例中无法返回“NEW_A”。我展示了它以使处理程序触发,因为如果 SELECT INTO 返回多行,则无法成功执行。顺便说一句,如果不返回任何行,我不记得 Oracle 是否会触发异常。Db2 抛出警告,而不是异常,并且此处理程序不会触发。
0赞 Shivanesh Raghuraman 1/10/2023
我在执行查询 SQL 错误 [42601] 时出现以下错误:在“END”之后发现意外的令牌“END-OF-STATEMENT”。预期的令牌可能包括:“JOIN <joined_table>”。SQLCODE=-104,SQLSTATE=42601,驱动程序=4.9.78