Возможно, вам придется добавить явное приведение типов - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь создать функцию, которая возвращает последний вставленный идентификатор, но показывает ошибку во время вызова функции: Не могли бы вы помочь мне определить мою ошибку.

ОШИБКА: функция public.insert_voucher (целое число, неизвестно, неизвестно, целое, целое, неизвестно) не существует
ЛИНИЯ 1: выберите public.insert_voucher (1, 'P', '20180909', 1, 1, 'txt');

Функция:

CREATE OR REPLACE FUNCTION public.insert_voucher(
     in_orgid smallint
    ,in_transtype character
    ,in_date character
    ,in_partnerid smallint
    ,in_quantity smallint
    ,in_remarks character varying)
  RETURNS integer AS
$BODY$
BEGIN
insert into 
public.transaction_header(
   org_id
  ,trans_type
  ,fiscal_year
  ,date
  ,partner_id
  ,quantity
  ,remarks
  ,create_by
  ,create_ts)
values (
   in_orgid
  ,in_transtype
  ,1819
  ,in_date
  ,in_partnerid
  ,in_quantity
  ,in_remarks
  ,1
  ,now())
returning trans_header_id;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 1;

Схема таблицы:

trans_header_id integer NOT NULL DEFAULT nextval('transaction_header_trans_header_id_seq'::regclass)
,org_id smallint NOT NULL
,trans_type character(1) NOT NULL DEFAULT 'P'::bpchar
,fiscal_year smallint NOT NULL DEFAULT '1819'::smallint
,date date NOT NULL
,partner_id smallint NOT NULL
,quantity smallint NOT NULL
,remarks character varying(100)
,create_by smallint NOT NULL
,create_ts timestamp without time zone NOT NULL DEFAULT now()
,update_by smallint
,update_ts timestamp without time zone
,CONSTRAINT transaction_header_pk PRIMARY KEY (trans_header_id)
,CONSTRAINT create_by FOREIGN KEY (create_by)
REFERENCES public.app_user (user_id) MATCH FULL
          ON UPDATE NO ACTION ON DELETE NO ACTION
,CONSTRAINT org_id FOREIGN KEY (org_id)
          REFERENCES public.organization (org_id) MATCH FULL
          ON UPDATE NO ACTION ON DELETE NO ACTION
,CONSTRAINT partner_id FOREIGN KEY (partner_id)
          REFERENCES public.partners (partner_id) MATCH FULL
          ON UPDATE NO ACTION ON DELETE NO ACTION
,CONSTRAINT update_by FOREIGN KEY (update_by)
          REFERENCES public.app_user (user_id) MATCH FULL
          ON UPDATE NO ACTION ON DELETE NO ACTION
,CONSTRAINT org_fy_transtype_transno UNIQUE (org_id, trans_type, fiscal_year)

Со ссылкой @muistooshort и @stickybit я обновляю предыдущую функцию.Надеюсь, что это даст больше ясности и вернет желаемый результат.

CREATE OR REPLACE FUNCTION public.insert_voucher(
    IN in_orgid smallint
    ,IN in_transtype character
    ,IN in_date date
    ,IN in_partnerid smallint
    ,IN in_quantity smallint
    ,IN in_remarks character varying
    ,OUT out_id smallint)
  RETURNS smallint AS
$BODY$
    BEGIN
    insert into 
    public.transaction_header(
       org_id
      ,trans_type
      ,fiscal_year
      ,date
      ,partner_id
      ,quantity
      ,remarks
      ,create_by
      ,create_ts)
    values (
       in_orgid
      ,in_transtype
      ,1819
      ,in_date
      ,in_partnerid
      ,in_quantity
      ,in_remarks
      ,1
      ,now())
    RETURNING trans_header_id
    INTO out_id;
    END
    $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 1;

1 Ответ

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

Проблема smallint s.Приведение от integer к smallint может означать потерю некоторой информации.Движок не будет делать неявных приведений, где информация может быть потеряна.Поэтому он рассматривает public.insert_voucher(integer, unknown, unknown, integer, integer, unknown) как не вариант.

Если вы явно приведете числа к smallint, вызов должен сработать.

SELECT public.insert_voucher(1::smallint, 'P', '20180909', 1::smallint, 1::smallint, 'txt');

Есть некоторые другие вещи, например, почему выпередать дату в виде строки и '1819'::smallint (почему строка первая?).И некоторые другие проблемы могут возникнуть, когда вызов работает.Но это за пределами текущего вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...