Выполнить запрос Select в конце функции - PullRequest
0 голосов
/ 04 декабря 2018

У меня 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"

LINE 36: RETURN *;

КОНТЕКСТ: PL / pgSQL-функция function_birthday (date) строка 43 в операторе EXECUTE

********** Ошибка **********

ОШИБКА: синтаксическая ошибка в или около «ВОЗВРАТА»

Состояние SQL: 42601

Контекст: строка 43 функции function_birthday (date) PL / pgSQL в операторе EXECUTE

Мой вопрос: где ошибка в моей функции, или я пишу в неправильной структуре функции, я искал и искал, чтобы решить ее (Как преобразовать мой CTE в функцию)?

Спасибо за Help, ^ _ ^

1 Ответ

0 голосов
/ 04 декабря 2018

Вы можете попробовать:

> -- 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;
...