2012-11-30 83 views
1

我有一個類似這樣的值的分隔字符串:00,45,50,66,84,99。該字符串作爲IN參數傳遞給DB2存儲過程。在這個過程中,我想遍歷這個字符串並將每個值插入一個臨時表中。我對DB2循環語法的瞭解很少,而且我一直在爲此苦苦掙扎。任何幫助將不勝感激,謝謝!在DB2中循環遍歷分隔字符串

+0

循環在SQL一般通常是一個壞主意,雖然這通常是指與錶行,而不是SP的搞亂。儘管如此,將它粘貼到臨時表中可能會有問題;我想我寧願返回一組行。 _爲什麼你有一個限定的值列表?如果這是來自外部資源(例如來自程序的查詢),爲什麼不使用數組(大多數驅動程序都支持)?如果這是內部的(例如表格中的列),那麼最好將數據標準化以便查詢。 –

+0

我使用分隔字符串作爲使用IN函數的替代方法,該函數不能應用於分隔參數。作爲解決方法,我的目標是使用分隔值填充臨時表,然後使用我的光標結果內部連接它以充當過濾器。 – Ted

+0

我知道的大多數驅動程序/框架(對於Java和C#而言,至少)都會接受一個數組,用於'IN()'子句中的值列表。什麼語言叫你的陳述,陳述是什麼,你在什麼平臺等等?而且我仍然強烈地提醒你臨時表 - 如果你需要爲兩組不同的參數使用同一個函數,會發生什麼?就此而言,您可能可以使用遞歸CTE來分割字符串,但我認爲SP將是最乾淨的解決方案。 –

回答

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 [email protected] 
<Copy, paste> in the interactive mode + quit 
db2 call rec ('00,45,50,66,84,99') 
db2 select * from table 
+0

因此,如果從我的主SP調用此SP,並且將'table'設置爲臨時表,我可以從我的主SP訪問臨時表,以便我可以執行連接?謝謝你的幫助! – Ted

+0

當然,如果你調用這個SP然後訪問Temp表,全部在同一個連接中完成,你不會有任何問題。 – AngocA

1

有時我會在XQuery中使用高級函數。您可以使用類似於

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

並在引號之間放置複雜的XQuery表達式。

然後,您可以將其包裝在XMLCAST中以將其轉換回SQL數據類型。我最近做了這個將長十六進制字符串轉換爲二進制,因爲XQuery有一個函數。

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