【问题标题】:Combining strings in DB2 Stored Procedure在 DB2 存储过程中组合字符串
【发布时间】:2016-04-22 21:20:42
【问题描述】:

我想知道如何在存储过程中组合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

【问题讨论】:

  • 你有什么问题?顺便说一句,+ 是算术运算符,它不适用于字符串。
  • 我想知道如何在存储过程中组合字符串。提取的值是一个电子邮件地址,我正在寻找一个列表。我想要的输出是 email@email.com、email2@email.com。 @mustaccio
  • 试试 concat(contact(expression1,','), expression2).看起来 concat 一次只需要两个参数

标签: sql stored-procedures db2


【解决方案1】:

关于 OP 已经尝试过的第一个,正如 @I_am_Batman 在 2016 年 4 月 23 日已经指出的那样,@ 的语法987654322@ 标量 >>-CONCAT--(--expression1--,--expression2--)------>< 仅限于两个参数,因此编码为 Concat(v_m1_email, ' , ' , v_email) 的表达式会失败,可能是 sqlcode=-170 提示类似“函数 CONCAT 的参数数量无效”。

没有注意到 DB2 的哪个变体 [不在标签中,也没有在 OP 中注释],但我将此链接提供给一些文档 DB2 for Linux UNIX and Windows 9.7.0->Database fundamentals->SQL->Functions->Scalar functions->CONCAT

但是,OP 已经尝试过的第二个没有明显不正确的地方;即假设所示的赋值和表达式,已按照CREATE PROCEDURE 的正文所示进行编码,前面有SET,后面有;。在这种情况下,语句SET v_m1_email = v_m1_email || ' , ' || v_email; 应该能够通过语法检查和数据类型\有效性检查。而在 OP 中显示为 SET v_m1_email = v_m1_email + ' , ' + v_email; 的内容无效,除非两个变量的值始终是数字的有效字符串表示形式;这是因为 + 运算符是 numeric-运算符,而不是用于实现连接的 [conspicuously as-desired] string-运算符[IE。对于“组合字符串”]。

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

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

注意:正如我已经在对先前答案的评论中添加的那样,在 SQL 源代码中使用 CONCAT 运算符与等效的 || 可以在其他代码页中使用该源代码,而不会出现由于使用变体字符。


附言。可能首选 CASE 语句代替 IF\ELSE 结构
p.p.s.如果 SP 真的应该返回 RS 和,或者只返回 OUT 参数,可能值得审查

【讨论】:

    【解决方案2】:

    字符串连接可以用 || 来完成。运算符。

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

    试试看。

    【讨论】:

    • FWiW:等效的 CONCAT 运算符避免使用跨 [至少一些 EBCDIC] 代码页变体的字符;使用CONCAT 代替|| 的表达式等效为:set vEmail = userName CONCAT '@' CONCAT domain CONCAT '.' CONCAT tld;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    相关资源
    最近更新 更多