【问题标题】:From SQL statement to function从 SQL 语句到函数
【发布时间】:2016-09-14 16:05:25
【问题描述】:

有没有办法放

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) 

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

【问题讨论】:

    标签: stored-procedures postgresql-9.5


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2019-08-09
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多