我叫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转换为函数)?
感谢帮助,^ _ ^
答案 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;