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