在DB2中循环分隔的字符串

时间:2012-11-30 22:12:27

标签: sql loops db2

我有一个分隔的值字符串,如:00,45,50,66,84,99。此字符串作为IN参数传递给DB2存储过程。在该过程中,我想循环遍历此字符串并将每个值插入临时表。我对DB2循环语法的了解很差,而且我一直在努力解决这个问题。非常感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

有时我在XQuery中使用高级函数。你可以使用像

这样的东西
SELECT    XMLQuery('$PORDER/PurchaseOrder/item/name'  PASSING porder AS "PORDER") 
FROM purchaseorder 

并在引号之间放置复杂的XQuery表达式。

然后,您可以将其包装在XMLCAST中,以将其转换回SQL数据类型。我最近这样做是为了将长十六进制字符串转换为二进制,因为XQuery有一个函数。

 SELECT XMLCAST(XMLQuery( ....) AS VARCHAR(100)) .....

答案 1 :(得分:0)

您可以定义一个递归SP,它接受IN varchar,处理第一个元素,并对其余元素进行递归调用。

CREATE OR REPLACE PROCEDURE REC (
 IN STRING VARCHAR(256)
)
P_REC: BEGIN
 DECLARE INDEX SMALLINT;
 DECLARE PRE VARCHAR(256);
 DECLARE POS VARCHAR(256);
 DECLARE STMT STATEMENT;
 PREPARE STMT FROM 'CALL REC(?)';

 SET INDEX = POSSTR (STRING, ',');
 IF (INDEX <> 0) THEN
  SET PRE = SUBSTR(STRING, 1, INDEX - 1);
  INSERT INTO table
    VALUES (PRE);
  -- Recursive call
  SET POS = SUBSTR(STRING, INDEX + 1);
  EXECUTE STMT USING POS;
 ELSE
  INSERT INTO table
    VALUES (STRING);
 END IF;
END P_REC @

使其从db2clp开始工作:

db2 create table table (string varchar(256))
db2 -td@
 <Copy, paste> in the interactive mode + quit
db2 call rec ('00,45,50,66,84,99')
db2 select * from table