提问人:Shivanesh Raghuraman 提问时间:1/6/2023 更新时间:1/6/2023 访问量:117
DB2 函数异常
DB2 FUNCTION EXCEPTION
问:
我正在将 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 语法是什么
答:
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
评论