如何将查询转换为存储函数?

时间:2017-03-16 15:07:14

标签: sql stored-procedures db2

我有一个查询,它根据2个变量返回一列Zip代码。如何使其返回与存储函数相同的表?我已经创建了一些基于任何变量返回单个结果的结果,但我似乎无法让它返回一个表。

select zone_id
  from(Select zone_id, distance, case when distance between 0 and 20 then 1 when distance between 21 and 50 then 2 when distance between 51 and 100 then 3 when distance between 101 and 150 then 4 else 5 end as bucket  
          From(select zone_id,city,province,terminal_zone, DIST_BETWEEN_ZONES((select postal_code from zone where zone_id = :TERMINAL ),zone_id) as distance 
                    from zone where service_type = 'DIRECT' and zone_id in (select zone_id from terminal_multi where terminal_zone = :TERMINAL))) where bucket = :Bucket

1 个答案:

答案 0 :(得分:0)

关键是声明一个光标,打开它并在程序结束时将其保持打开状态。

CREATE PROCEDURE myproc (
    IN pTerminal INT
    ,IN pBucket INT
    ) LANGUAGE SQL DYNAMIC result sets 1

BEGIN
    DECLARE rtn_cur CURSOR WITH RETURN
    FOR
    SELECT zone_id
    FROM (
        SELECT zone_id
            ,distance
            ,CASE 
                WHEN distance BETWEEN 0
                        AND 20
                    THEN 1
                WHEN distance BETWEEN 21
                        AND 50
                    THEN 2
                WHEN distance BETWEEN 51
                        AND 100
                    THEN 3
                WHEN distance BETWEEN 101
                        AND 150
                    THEN 4
                ELSE 5
                END AS bucket
        FROM (
            SELECT zone_id
                ,city
                ,province
                ,terminal_zone
                ,DIST_BETWEEN_ZONES((
                        SELECT postal_code
                        FROM zone
                        WHERE zone_id = pTerminal
                        ), zone_id) AS distance
            FROM zone
            WHERE service_type = 'DIRECT'
                AND zone_id IN (
                    SELECT zone_id
                    FROM terminal_multi
                    WHERE terminal_zone = pTerminal
                    )
            )
        )
    WHERE bucket = pBucket;

    OPEN rtn_cur;
END