从 SQL 语句到函数

From SQL statement to function

有没有办法把

WITH RECURSIVE cte(path) AS ( --Recursively call on path (Works for every length)
    SELECT array[r.term1_id, r.term2_id] AS path
    FROM   temp_table r
    LEFT   JOIN temp_table r0 ON r0.term1_id = r.term2_id
    WHERE  r0.term2_id IS NULL
UNION ALL 
    SELECT r.term1_id || c.path
    FROM   cte c
    JOIN   temp_table r ON r.term2_id = c.path[1]
),
max_len AS (
    SELECT max(array_length(path, 1)) max_len
    FROM cte
    )
SELECT array_to_string(fill_with_last_element(path, max_len), ',' , '*')
FROM cte
CROSS JOIN max_len
ORDER BY path;

进入存储过程?

我想把这个函数做成一个存储过程。

fill_with_last_element(path, max_len) 

数据库中是否已有函数,一个存储过程可以调用另一个存储过程吗?

是的,你可以把它变成一个函数(Postgres 没有过程):

create function get_data()
  returns table (path text)
as
$$
WITH RECURSIVE cte(path) AS ( --Recursively call on path (Works for every length)
    SELECT array[r.term1_id, r.term2_id] AS path
    FROM   temp_table r
    LEFT   JOIN temp_table r0 ON r0.term1_id = r.term2_id
    WHERE  r0.term2_id IS NULL
UNION ALL 
    SELECT r.term1_id || c.path
    FROM   cte c
    JOIN   temp_table r ON r.term2_id = c.path[1]
),
max_len AS (
    SELECT max(array_length(path, 1)) max_len
    FROM cte
    )
SELECT array_to_string(fill_with_last_element(path, max_len), ',' , '*')
FROM cte
CROSS JOIN max_len
ORDER BY path;
$$
language sql;