Изменение функции для получения дополнительного аргумента/добавления параметра

CREATE OR REPLACE FUNCTION updatetodoitem(integer, text, text, text, integer, integer, integer, date, date, character, date, date, integer, text, boolean, text) RETURNS integer AS
$BODY$
  DECLARE
    ptodoitemid ALIAS FOR  $1;
    pusername   ALIAS FOR  $2;
    pname       ALIAS FOR  $3;
    pdesc       ALIAS FOR  $4;
    pincdtid    ALIAS FOR  $5;
    pcrmacctid  ALIAS FOR  $6;
    pOpheadid   ALIAS FOR  $7;
    pstarted    ALIAS FOR  $8;
    pdue        ALIAS FOR  $9;
    pstatus     ALIAS FOR $10;
    passigned   ALIAS FOR $11;
    pcompleted  ALIAS FOR $12;
    ppriority   ALIAS FOR $13;
    pnotes      ALIAS FOR $14;
    pactive     ALIAS FOR $15;
    powner  ALIAS FOR $16;
    plock   ALIAS FOR $17;

    _priority   INTEGER         := ppriority;
    _status     CHARACTER(1)    := pstatus;
    _incdtid    INTEGER         := pincdtid;
    _crmacctid  INTEGER         := pcrmacctid;
    _opheadid   INTEGER         := pOpheadid;
    _assigned   DATE            := passigned;
    _active     BOOL            := pactive;
    _result     INTEGER;
    _lock       BOOL            := plock;

  BEGIN
    IF (pusername IS NULL OR pusername = '') THEN
      RETURN -1;
    END IF;

    IF (pname IS NULL OR pname = '') THEN
      RETURN -2;
    END IF;

    IF (pdue IS NULL) THEN
      RETURN -3;
    END IF;

    IF (ptodoitemid IS NULL OR ptodoitemid <= 0) THEN
      RETURN -10;
    END IF;

    IF (pcompleted IS NOT NULL) THEN
      _status := 'C';
    ELSIF (pstatus IS NULL AND pstarted IS NOT NULL) THEN
      _status := 'I';
    ELSIF (pstatus IS NULL) THEN
      _status := 'N';
    END IF;

    IF (_incdtid <= 0) THEN
      _incdtid := NULL;
    END IF;

    IF (_crmacctid <= 0) THEN
      _crmacctid := NULL;
    END IF;

    IF (_opheadid <= 0) THEN
      _opheadid := NULL;
    END IF;

    IF (_priority <= 0) THEN
      _priority := NULL;
    END IF;

    IF (_assigned IS NULL) THEN
      _assigned := CURRENT_DATE;
    END IF;

    IF (_active IS NULL) THEN
      _active := TRUE;
    END IF;

    UPDATE todoitem SET
        todoitem_username=pusername, todoitem_name=pname, todoitem_description=pdesc,
        todoitem_incdt_id=_incdtid, todoitem_status=_status,
        todoitem_active=_active, todoitem_lock=lock, todoitem_start_date=pstarted,
        todoitem_due_date=pdue, todoitem_assigned_date=_assigned,
        todoitem_completed_date=pcompleted, todoitem_priority_id=_priority,
        todoitem_notes=pnotes, todoitem_crmacct_id=_crmacctid,
        todoitem_ophead_id=_opheadid, todoitem_owner_username=powner 
    WHERE (todoitem_id=ptodoitemid);

    RETURN ptodoitemid;
  END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

Мне нужно добавить параметр блокировки в мою функцию updatetodoitem. Сейчас он принимает 16 параметров, мне нужно его как-то изменить, чтобы он принимал 17-й параметр. Прямо сейчас он говорит: «Функция ошибки не имеет параметра $ 17».


person Community    schedule 12.06.2013    source источник
comment
Это можно было бы намного упростить. Но вы забыли указать свою версию Postgres.   -  person Erwin Brandstetter    schedule 21.06.2013


Ответы (1)


Вам также необходимо изменить эту часть:

CREATE OR REPLACE FUNCTION updatetodoitem(integer, text, text, text, integer, integer, integer, date, date, character, date, date, integer, text, boolean, text)

И, предположительно, добавьте логическое значение:

CREATE OR REPLACE FUNCTION updatetodoitem(integer, text, text, text, integer, integer, integer, date, date, character, date, date, integer, text, boolean, text, boolean)
person Denis de Bernardy    schedule 12.06.2013
comment
Обратите внимание, что она не заменит старую функцию; старая версия с 16 параметрами будет продолжать существовать, если не будет удалена. Вы можете заменить его простой оболочкой LANGUAGE SQL, которая для удобства вызывает версию с 17 аргументами. - person Craig Ringer; 13.06.2013