1

我有一个带分隔符的字符串,例如:00,45,50,66,84,99。该字符串作为 IN 参数传递给 DB2 存储过程。在这个过程中,我想遍历这个字符串并将每个值插入到一个临时表中。我对 DB2 循环语法的了解很差,我为此苦苦挣扎了一段时间。任何帮助将不胜感激,谢谢!

4

2 回答 2

1

有时我会使用 XQuery 中的高级功能。你可以使用类似的东西

SELECT    XMLQuery('$PORDER/PurchaseOrder/item/name'  PASSING porder AS "PORDER") 
FROM purchaseorder 

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

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

 SELECT XMLCAST(XMLQuery( ....) AS VARCHAR(100)) .....
于 2012-12-01T15:40:49.703 回答
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
于 2012-12-01T21:26:29.427 回答