2016-09-14 67 views
0

有没有把从SQL语句的功能

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) 

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

回答

1

是的,你可以把它转换成一个功能(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; 
+0

真的很感谢你们! – xCloudx8