如何将此代码转换为PostgreSQL存储过程?

如何将此代码转换为PostgreSQL存储过程?,postgresql,Postgresql,我是PostgreSQL的新手。我想将此代码转换或添加到存储过程中 WITH RECURSIVE t(i) AS ( SELECT * FROM unnest((select regexp_split_to_array('signature',''))::char[]) ), cte AS ( SELECT i AS combo, i, 1 AS ct FROM t UNION ALL SELECT cte.combo || t.i, t.i, ct

我是PostgreSQL的新手。我想将此代码转换或添加到存储过程中

WITH RECURSIVE t(i) AS (
  SELECT * FROM unnest((select regexp_split_to_array('signature',''))::char[])
), cte AS (
     SELECT i AS combo, i, 1 AS ct 
     FROM t 
   UNION ALL 
     SELECT cte.combo || t.i, t.i, ct + 1
     FROM cte, t
     WHERE ct <= 8
       AND position(t.i in cte.combo) = 0
) 
SELECT distinct cc.combo,ww.word 
FROM cte cc 
   inner join words ww ON ww.word=cc.combo 
WHERE length(combo)>1 
  AND ww.source_id in(1,2,19,21,24,26,33,34) 
ORDER BY cc.combo ASC;

只需将其放入函数中:

create function generate_anagrams(p_word text)
  returns table(combo text, word text)
as
$$
WITH RECURSIVE t(i) AS (
  SELECT * 
  FROM unnest((select regexp_split_to_array(p_word,''))::char[])
), cte AS (
     SELECT i AS combo, i, 1 AS ct 
     FROM t 
   UNION ALL 
     SELECT cte.combo || t.i, t.i, ct + 1
     FROM cte, t
     WHERE ct <= 8
       AND position(t.i in cte.combo) = 0
) 
SELECT distinct cc.combo,ww.word 
FROM cte cc 
   inner join words ww ON ww.word=cc.combo 
WHERE length(combo)>1 
  AND ww.source_id in(1,2,19,21,24,26,33,34) 
ORDER BY cc.combo ASC
$$
language sql;

你为什么要这么做?你可以简单地把它放到一个视图中。除了一个集合返回函数可能是更好的选择,实际上,这段代码返回上面代码中给定单词的所有字谜,我已经通过了“签名”。我想写一个过程,在这里我可以通过传递一个单词来简单地执行这个过程。调用Proc_Nameword。它将返回给定单词的所有字谜。
select *
from generate_anagrams('signature');