2010-10-07 2 views
4

Я продолжаю искать этот ответ онлайн, но я не могу его найти.Как передать запись в качестве параметра для функции PL/pgSQL?

Я пытаюсь передать одну запись по функции PL/pgSQL. Я попробовал это двумя способами.

Кулак путь:

CREATE OR REPLACE FUNCTION translateToReadableDate(mRecord dim_date%ROWTYPE) RETURNS void AS $$ 

Это Ouput:

psql:requestExample.sql:21: ERROR: syntax error at or near "%" 
LINE 1: ... FUNCTION translateToReadableDate(mRecord dim_date%ROWTYPE) ... 
                  ^

Второй способ:

CREATE OR REPLACE FUNCTION translateToReadableDate(mRecord RECORD) RETURNS void AS $$ 

И есть выход

psql:requestExample.sql:21: ERROR: PL/pgSQL functions cannot accept type record 

Кто-то знает, как это сделать, пожалуйста?

CREATE OR REPLACE FUNCTION translateToReadableDate(mRecord dim_date) RETURNS void AS $$ 

    BEGIN 

    SELECT dim_day.name || ' (' || dim_day_in_month.id || ') ' || dim_month.name || 'is the ' || dim_week.id || ' week of the year. ' AS "Une phrase", dim_quarter.id, dim_year.id 
    FROM dim_date dd 
    JOIN dim_day ON dd.day_id = dim_day.day_id 
    JOIN dim_day_in_month ON dd.day_in_month_id = day_in_month.day_in_month_id 
    JOIN dim_week ON dd.week_id = dim_week.week_id 
    JOIN dim_month ON dd.month_id = dim_month.month_id 
    JOIN dim_quarter ON dd.quarter_id = dim_quarter.quarter_id 
    JOIN dim_year ON dd.year_id = dim_year.year_id 
    WHERE dd.day_id = mRecord.day_id 
    AND dd.day_in_month_id = mRecord.day_in_month_id 
    AND dd.week_id = mRecord.week_id 
    AND dd.month_id = mRecord.month_id 
    AND dd.quarter_id = mRecord.quarter_id 
    AND dd.year_id = mRecord.year_id; 

    END; 
    $$ LANGUAGE plpgsql; 
+0

Вы уверены, что dim_date является именем таблицы? – gcores

+0

В моем случае да. – Spredzy

ответ

2

Попробуйте это:

CREATE OR REPLACE FUNCTION translateToReadableDate(mRecord dim_date) RETURNS void AS $$ 

dim_date должен быть таблицей.

EDIT:

Хорошо, теперь я действительно очень смущен.

  1. Дата должна быть столбиком, а не столом. Я не понимаю, почему вы создали таблицу с датами.
  2. Вы можете форматировать даты без проблем с to_char. Прочтите это: Data Type Formatting Functions, чтобы узнать, как это сделать. То, что вы создали, делает нулевой смысл.
  3. Вывод PL/pgSQL? Не следует ли форматировать средний уровень? Вы должны просто вернуть дату из базы данных.

Наконец, я бы рекомендовал прочитать PL/pgSQL Manual. Там много хорошего.

+0

Когда я сделал то, что вы мне сказали, он скомпилировался, но я получил странную ошибку #SELECT translateToReadableDate ((SELECT * FROM dim_date LIMIT 1)); ОШИБКА: подзапрос должен возвращать только один столбец ЛИНИЯ 1:. ВЫБРАТЬ translateToReadableDate ((SELECT * FROM dim_date ПРЕДЕЛА ... ^ Так что не принимают запись в качестве параметра Спасибо за помощь мне – Spredzy

+0

translateToReadableDate возвращают недействительными и. вы используете его в Select? Что именно вы делаете? Это не имеет особого смысла. Функция делает запись как параметр, я уверен в этом, это то, как вы используете, это дает вам проблему – gcores

+0

translateToReadableDate (mRecord) не возвращает ничего истинного. Это всего лишь своеобразное продуманное эхо - я согласен с вами, что это может быть не самый лучший способ - внутри него я просто до SELECT, чтобы я мог видеть результат. что я пытаюсь сделать? – Spredzy

Смежные вопросы