2015-11-06 92 views
1

我寫了一個程序來生成長度爲2的字符串的所有可能的組合。程序如下:在oracle中生成一定長度的字符串的所有可能組合

CREATE OR REPLACE PROCEDURE string_combinations 
AS 
    vblString1 VARCHAR2(100); 
    vblString2 VARCHAR2(100); 
    vblChr1  NUMBER; 
    vblChr2  NUMBER; 
BEGIN 
    vblChr1 := 65; 
    LOOP 
    SELECT Chr(vblChr1) INTO vblString1 FROM dual; 
    vblChr2 := 65; 
    LOOP 
     vblString2 := vblString1||Chr(vblChr2); 
     Dbms_Output.put_line(vblString2); 
     vblChr2:=vblChr2+1; 
     EXIT WHEN vblChr2=91; 
    END LOOP; 
    vblChr1:=vblChr1+1; 
    EXIT WHEN vblChr1=91; 
    END LOOP; 
END; 
/

我已經在另一個循環內使用循環。所以,如果我必須生成長度爲三的字符串,我可以簡單地使用另一個循環。但是如果我想要生成長度爲5,6,7或更長的字符串,那將會很長。我如何使用遞歸來實現它? 我正在使用oracle。

回答

2

您不需要PL/SQL生成一個字母順序。你可以在純SQL使用行發生器方法。

WITH combinations AS 
    (SELECT chr(ascii('A')+level-1) c FROM dual CONNECT BY level <= 26 
) 
SELECT * FROM combinations 
UNION ALL 
SELECT c1.c || c2.c FROM combinations c1, combinations c2 
UNION ALL 
SELECT c1.c 
    || c2.c 
    || c3.c 
FROM combinations c1, 
    combinations c2, 
    combinations c3 
/

上述會給你所有可能的組合c1c2c3單和兩個字符。對於更多的組合,你可以只添加組合,如c4,c5等。

+1

多麼美麗的解決方案。感謝您的快速回復。節省了很多時間。 – hsuyaa

+0

@hsuyaa不客氣! –

0

爲什麼不能這樣?

SELECT * FROM a1; 

     ID NAME 
---------- ---------- 
     1 a 
     2 b 
     3 c 
     4 d 
     5 e 

選中5行。

SELECT a.id,b.name 
    FROM (SELECT id FROM a1) a, (SELECT name FROM a1) b 
ORDER BY a.id, b.name; 

     ID NAME 
---------- ---------- 
     1 a 
     1 b 
     1 c 
     1 d 
     1 e 
     2 a 
     2 b 
     2 c 
     2 d 
     2 e 
     3 a 
     3 b 
     3 c 
     3 d 
     3 e 
     4 a 
     4 b 
     4 c 
     4 d 
     4 e 
     5 a 
     5 b 
     5 c 
     5 d 
     5 e 

選中25行。

相關問題