我编写了一个程序来生成长度为2的字符串的所有可能组合。该计划如下:
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;
/
我在另一个循环中使用了一个循环。所以,如果我必须生成长度为3的字符串,我可以简单地使用另一个循环。但如果我希望生成长度为5,6,7或更长的字符串,那将会很长。我如何使用递归来实现它? 我正在使用oracle。
答案 0 :(得分: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
/
上述内容可为您提供所有可能的组合c1
,c2
,c3
,用于单个和两个字符。要获得更多组合,您只需添加c4
,c5
等组合
答案 1 :(得分: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行。