POSTGRESQL PG / PGSQL - функция с параметрами - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть некоторые проблемы при создании функции в Postgresql, у меня есть эта функция:

CREATE OR REPLACE FUNCTION public.isp_ticket(_cr integer, _grupo character varying(255), _numero integer, _descripcion text, _resumen character varying(255), _fechaaper timestamp with time zone, _fechacierr timestamp with time zone, _tipo smallint, _apellidousuarioafectado character varying(255), _apellidosolicitante character varying(255), _tenant character varying(255), _metodoreportado character varying(100), _prioridad smallint, _sla character varying(255), _categoria character varying(255), _estado character varying(255), _herramienta_id integer, _asignado character varying(255), _nombresolicitante character varying(255), _nombreusuarioafectado character varying(255))
RETURNS void AS $$

BEGIN
     CASE 
         WHEN _asignado = '' AND _close_date = '' AND _sla = '' 
         THEN  INSERT INTO public.website_ticket(cr, grupo, numero, descripcion, resumen, fechaaper, tipo, apellidousuarioafectado, apellidosolicitante, tenant, metodoreportado, prioridad, categoria, estado, herramienta_id, nombresolicitante, nombreusuarioafectado) VALUES (_cr, _grupo, _numero, _descripcion, _resumen, _fechaaper, _tipo, _apellidousuarioafectado, _apellidosolicitante, _tenant, _metodoreportado, _prioridad, _categoria, estado, _herramienta_id, _nombresolicitante, _nombreusuarioafectado);
         WHEN _asignado = '' AND _close_date = ''
         THEN INSERT INTO public.website_ticket(cr, grupo, numero, descripcion, resumen, fechaaper, tipo, apellidousuarioafectado, apellidosolicitante, tenant, metodoreportado, prioridad, sla, categoria, estado, herramienta_id, nombresolicitante, nombreusuarioafectado) VALUES (_cr, _grupo, _numero, _descripcion, _resumen, _fechaaper, _tipo, _apellidousuarioafectado, _apellidosolicitante, _tenant, _metodoreportado, _prioridad, _sla, _categoria, _estado, _herramienta_id, _nombresolicitante, _nombreusuarioafectado);
         WHEN new_close_date = ''
         THEN INSERT INTO public.website_ticket(cr, grupo, numero, descripcion, resumen, fechaaper, tipo, apellidousuarioafectado, apellidosolicitante, tenant, metodoreportado, prioridad, sla, categoria, estado, herramienta_id, asignado,nombresolicitante, nombreusuarioafectado)
    VALUES (_cr, _grupo, _numero, _descripcion, _resumen, _fechaaper, _tipo, _apellidousuarioafectado, _apellidosolicitante, _tenant, _metodoreportado, _prioridad, _sla, _categoria, _estado, _herramienta_id, _asignado, _nombresolicitante, _nombreusuarioafectado);
ELSE
UPDATE public.website_ticket SET fechacierr = _fechacierr WHERE numero = _numero;
END CASE;
END;
$$ LANGUAGE plpgsql;

и когда я пытаюсь использовать функцию, делая это:

SELECT public.isp_ticket(924266, 
'EUS_Zona V Region', 
512294,
'Nombre: Gisselle Espinoza Contreras\nCorreo: gespinoza@bancoripley.cl   
\nAnexo: 6221\nUbicación: Valparaiso\nPais: Chile\nMotivo: Usuario indica 
que su computador se apagó repentinamente. Se pudo entrar a windows después 
de un buen rato, pero no puede ingresar a las aplicaciones que se conecten a 
red.\n\nDirección: Plaza Victoria 1646 - Piso 1 - Banco',
'Valparaiso // Computador con problemas de conexión.',
'2018-01-23 15:17:51',
'',
1,
'Espinoza Contreras',
'Espinoza Contreras',
'Ripley',
'Telephone',
3,
'',
'Ripley.Hardware.Desktop.Falla',
'Open',
1,
'',
'Gissel Rose Marie',
'Gissel Rose Marie')

Я пытался CAST каждое значение, и оно тоже не работало, всегда появлялась одна и та же ошибка:

ОШИБКА: не существует. Public.isp_ticket (целое число, изменение символа, целое число, текст, изменение символа, временная метка с часовым поясом, неизвестно, целое число, изменение символа, изменение символа, изменение символа, изменение символа, целое число, неизвестно, изменение символа, изменение символа, целое число, неизвестно, изменение символа, изменение символа) ЛИНИЯ 1: ВЫБЕРИТЕ public.isp_ticket ( ^ Состояние SQL: 42883 Символ: 8

Мне нужна помощь, как я могу это исправить?

Вперед, спасибо всем !!!

1 Ответ

0 голосов
/ 26 апреля 2018

Параметр # 7, _fechacierr должен быть timestamp with time zone. Вы не можете передать '', изменить его на ноль (и привести к timestamp with time zone), если вам нужно пустое значение.

И стоит прочитать , как PostgreSQL находит конкретную функцию для вызова , особенно:

Если какие-либо входные аргументы неизвестны, проверьте допустимые категории типов на этих позициях аргумента оставшимися кандидатами. На каждом положение, выберите категорию строки, если какой-либо кандидат принимает это категория. (Этот уклон в сторону строки подходит, так как литерал неизвестного типа выглядит как строка.) В противном случае, если все остальные кандидаты принимают ту же категорию типа, выберите категория; в противном случае неудача, потому что правильный выбор не может быть выведен без дополнительных подсказок. Теперь откажитесь от кандидатов, которые не принимают выбранный тип категории. Кроме того, если любой кандидат принимает предпочитаемый тип в этой категории, отбросить кандидатов, которые принимают не предпочтительные типы для этого аргумента. Оставьте всех кандидатов, если их нет пережить эти испытания. Если остается только один кандидат, используйте его; еще перейдите к следующему шагу.

...