2015-11-06 97 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行。

相关问题