在函数末尾执行选择查询

时间:2018-12-04 03:03:14

标签: sql postgresql function plpgsql

我叫CTE,

WITH extract_dow AS (
SELECT EXTRACT(DOW FROM TIMESTAMP '1994-03-15'::DATE) AS dow
)
,name_day AS(
SELECT
CASE WHEN dow = 0 THEN (SELECT 'Minggu'::TEXT AS day)
    ELSE
    CASE WHEN dow = 1 THEN (SELECT 'Senin'::TEXT AS day)
        ELSE
        CASE WHEN dow = 2 THEN (SELECT 'Selasa'::TEXT AS day)
            ELSE
            CASE WHEN dow = 3 THEN (SELECT 'Rabu'::TEXT AS day)
                ELSE
                CASE WHEN dow = 4 THEN (SELECT 'Kamis'::TEXT AS day)
                    ELSE
                    CASE WHEN dow = 5 THEN (SELECT 'Jumat'::TEXT AS day)
                        ELSE
                        CASE WHEN dow = 6 THEN (SELECT 'Sabtu'::TEXT AS day)
                            ELSE (SELECT 'Inputan Salah'::TEXT AS day)
                        END
                    END
                END
            END
        END
    END
END
FROM extract_dow
)

, extract_age AS (
SELECT ((CURRENT_DATE - '1994-03-15'::DATE)/365) AS age
)

SELECT 'Anda Lahir :' || a.day || ',' || b.age || ' Tahun'  AS "Keterangan" FROM name_day a, extract_age b

它会在日期为'1994-03-15'的文本中生成日,并根据当前的年龄进行计算,执行时​​将在输出中显示

"Anda Lahir :Selasa,24 Tahun"

当我尝试将其转换为波纹管时:

> -- Function: function_birthday(date)
> 
> -- DROP FUNCTION function_birthday(date);
> 
> CREATE OR REPLACE FUNCTION function_birthday(inputan date)   
> RETURNS text AS 
> $BODY$ 
> DECLARE   
> perintah text; 
> BEGIN
>
> perintah :=  $sql$
> 
>   WITH extract_dow AS (   SELECT EXTRACT(DOW FROM TIMESTAMP '$sql$ || inputan || $sql$'::DATE) AS dow     )
>   ,name_day AS(   SELECT  CASE WHEN dow =  0 THEN (SELECT 'Minggu'::TEXT AS day)
>       ELSE CASE WHEN dow = 1 THEN (SELECT 'Senin'::TEXT AS day)
>           ELSE 
>           CASE WHEN dow = 2 THEN (SELECT 'Selasa'::TEXT AS day)
>               ELSE
>               CASE WHEN dow = 3 THEN (SELECT 'Rabu'::TEXT AS day)
>                   ELSE
>                   CASE WHEN dow = 4 THEN (SELECT 'Kamis'::TEXT AS day)
>                       ELSE
>                       CASE WHEN dow = 5 THEN (SELECT 'Jumat'::TEXT AS day)
>                           ELSE
>                           CASE WHEN dow = 6 THEN (SELECT 'Sabtu'::TEXT AS day)
>                               ELSE (SELECT 'Inputan Salah'::TEXT AS day)
>                           END
>                       END
>                   END
>               END             
>           END
>      END
> END FROM extract_dow  )
>
>
>   , extract_age AS (  SELECT ((CURRENT_DATE - '$sql$ || inputan || $sql$'::DATE)/365) AS age)
> SELECT 'Anda Lahir :' || a.day || ',' || b.age || ' Tahun'  AS "Keterangan" FROM name_day a, extract_age b
> 
> RETURN *;
> $sql$;
> EXECUTE perintah;      
> END;
> $BODY$
> LANGUAGE plpgsql VOLATILE   COST 100;
> ALTER FUNCTION function_birthday(date)   
> OWNER TO postgres;

但是当我用

执行它时
  

SELECT public.function_birthday('1994-03-15');

我有错误

  

错误:“ RETURN”处或附近的语法错误

     

第36行:返回*;

     

上下文:EXECUTE语句中的PL / pgSQL函数function_birthday(date)第43行

     

**********错误**********

     

错误:“ RETURN”处或附近的语法错误

     

SQL状态:42601

     

上下文:EXECUTE语句中的PL / pgSQL函数function_birthday(date)第43行

我的问题是,函数的错误在哪里,或者我写的函数结构错误,我已经在寻找并寻求解决方法(如何将CTE转换为函数)?

感谢帮助,^ _ ^

1 个答案:

答案 0 :(得分:0)

您可以尝试:

> -- Function: function_birthday(date)
> 
> -- DROP FUNCTION function_birthday(date);
> 
> CREATE OR REPLACE FUNCTION function_birthday(inputan date)   
> RETURNS text AS 
> $BODY$ 
> DECLARE   
> perintah text; 
> result text;
> BEGIN
>
> perintah :=  $sql$
> 
>   WITH extract_dow AS (   SELECT EXTRACT(DOW FROM TIMESTAMP '$sql$ || inputan || $sql$'::DATE) AS dow     )
>   ,name_day AS(   SELECT  CASE WHEN dow =  0 THEN (SELECT 'Minggu'::TEXT AS day)
>       ELSE CASE WHEN dow = 1 THEN (SELECT 'Senin'::TEXT AS day)
>           ELSE 
>           CASE WHEN dow = 2 THEN (SELECT 'Selasa'::TEXT AS day)
>               ELSE
>               CASE WHEN dow = 3 THEN (SELECT 'Rabu'::TEXT AS day)
>                   ELSE
>                   CASE WHEN dow = 4 THEN (SELECT 'Kamis'::TEXT AS day)
>                       ELSE
>                       CASE WHEN dow = 5 THEN (SELECT 'Jumat'::TEXT AS day)
>                           ELSE
>                           CASE WHEN dow = 6 THEN (SELECT 'Sabtu'::TEXT AS day)
>                               ELSE (SELECT 'Inputan Salah'::TEXT AS day)
>                           END
>                       END
>                   END
>               END             
>           END
>      END
> END FROM extract_dow  )
>
>
>   , extract_age AS (  SELECT ((CURRENT_DATE - '$sql$ || inputan || $sql$'::DATE)/365) AS age)
> SELECT 'Anda Lahir :' || a.day || ',' || b.age || ' Tahun'  AS "Keterangan" FROM name_day a, extract_age b
> 
> $sql$;
> EXECUTE perintah INTO result;      
> RETURN result;    
> END;
> $BODY$
> LANGUAGE plpgsql VOLATILE   COST 100;
> ALTER FUNCTION function_birthday(date)   
> OWNER TO postgres;