结合DB2存储过程

时间:2016-04-22 21:20:43

标签: sql stored-procedures db2

我想知道如何在存储过程中组合Varchar个变量。我想将电子邮件地址组合成基于访问级别的单个变量。我在if语句中尝试过做一些事情。

例如,我尝试了两种方法:

v_m1_email = Concat(v_m1_email, ' , ' , v_email)

v_m1_email = v_m1_email || ' , ' || v_email

我的代码:

CREATE PROCEDURE ALERTEMAIL (OUT p_m1_email VARCHAR(300),
                         OUT p_m2_email VARCHAR(300),
                         OUT p_m3_email VARCHAR(300),
                         OUT p_m4_email VARCHAR(300))
DYNAMIC RESULT SETS 1
P1: BEGIN
DECLARE v_email VARCHAR(50);
DECLARE v_access CHAR(5);
DECLARE v_m1_email VARCHAR(300);
DECLARE v_m2_email VARCHAR(300);
DECLARE v_m3_email VARCHAR(300);
DECLARE v_m4_email VARCHAR(300);
DECLARE SQLSTATE CHAR(5);
DECLARE cursor1 CURSOR WITH RETURN for
    SELECT EMAIL,JOB_ID FROM PERSONNEL;

OPEN cursor1;
FETCH cursor1 INTO v_email, v_access;
WHILE (SQLSTATE = '00000') DO
    IF v_access = 'Man1' THEN
        SET v_m1_email = v_m1_email + ' , ' + v_email;
    ELSEIF v_access = 'Man2' THEN
        SET v_m2_email = v_m2_email + ' , ' + v_email;
    ELSEIF v_access = 'Man3' THEN
        SET v_m3_email = v_m3_email + ' , ' + v_email;
    ELSEIF v_access = 'Man4' THEN
        SET v_m4_email = v_m4_email + ' , ' + v_email;
    END IF;
FETCH cursor1 INTO v_email, v_access;
END WHILE;
SET p_m1_email = v_m1_email;
SET p_m2_email = v_m2_email;
SET p_m3_email = v_m3_email;
SET p_m4_email = v_m4_email;

END P1

2 个答案:

答案 0 :(得分:0)

可以使用||进行字符串连接操作

set vEmail = userName || '@' || domain || '.' || tld;

试一试。

答案 1 :(得分:0)

关于OP中已经 尝试 的第一个内容,就像2016年4月23日的@I_am_Batman已经注意到的那样,{的语法{1}}标量CONCAT仅限于两个参数,因此编码为>>-CONCAT--(--expression1--,--expression2--)------><的表达式将失败,大概是sqlcode = -170,表示“函数CONCAT的参数数量无效” 。“

没有注意到DB2的哪个变体[不在标签中或OP中的评论],但是我提供了这个链接到某个文档DB2 for Linux UNIX and Windows 9.7.0->Database fundamentals->SQL->Functions->Scalar functions->CONCAT

然而,从OP中已经 尝试 的第二个没有明显错误;即假设所示的赋值和表达式,其编码正如Concat(v_m1_email, ' , ' , v_email)的正文中所示,前面有CREATE PROCEDURE和尾随SET。在这种情况下,语句;应该能够通过语法检查和数据类型\有效性检查。 OP中显示的SET v_m1_email = v_m1_email || ' , ' || v_email;无效,除非两个变量的值始终是数字的有效字符串表示形式;这是因为SET v_m1_email = v_m1_email + ' , ' + v_email;运算符是数字 - 运算符而不是[显着的所需] 字符串 - 运算符效果连接[即用于“组合字符串”]。

[ed:22-Aug-2016]我忘了在上面的表达式中有一个常量\ literal +,所以string-literal也必须作为数字计算,以允许该表达式与{ {1}}作为加法运算符在运行时运行。但是,当然,这个文字永远不能被解释为数字;因此虽然表达式可以被视为对编译时有效[隐式强制转换而数据检查未检查文字值],但表达式从不将能够在运行时进行评估

因此,如果' , '运算符被正确编码[看起来如此,根据声称已被“尝试”],但未影响所需,则OP需要更新为确切地说明了问题所在。例如,可能在例程的compile \ CREATE中有一个错误,或者可能是一个运行时错误,其连接的效果可能是未修剪的结果或其他一些意外的输出,或其他什么。?。?

注意:正如我在先前的答案的评论中添加的那样,+运算符与SQL源中的等效||的使用允许在\跨其他代码页中使用该源而不使用由于使用变体字符可能会出现问题。


P.S.可能首选CASE语句来代替IF \ ELSE结构
p.p.s.如果SP确实应该同时返回RS和/或OUT参数

,那么可能值得一看