Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Функция с данными именем и типами аргументов не найдена. как исправить?  [new]
Eva2003
Member

Откуда:
Сообщений: 3
написала функцию для добавления в таблицу :

CREATE OR REPLACE FUNCTION public.add_doc(doc_name text, amount int,  newtip_name text, new_izd bool,
										  newotr_name text, _author text, _izdat text, _god int )
RETURNS boolean
LANGUAGE plpgsql 
AS $function$declare
return_val boolean := true;
new_tipid int = -1;
new_izdid int = -1;
new_otrid int = -1;

tip_cursor CURSOR (firstCursor TEXT) FOR SELECT "шифр типа" FROM тип 
WHERE 
 "тип" = firstCursor;
izd_cursor CURSOR (secondCursor bool) FOR SELECT "шифр издания" FROM
издание WHERE 
 "постоянное" = secondCursor;
otr_cursor CURSOR (thirdCursor TEXT) FOR SELECT "шифр отрасли" FROM отрасль 
WHERE 
 отрасль."название" = thirdCursor;
BEGIN

if (doc_name IS null) THEN 
	raise EXCEPTION 'пустой тип? так не пойдет'; 
	return_val := false; END if; 
if (amount IS null) THEN 
	raise EXCEPTION 'пустой тип? так не пойдет'; 
	return_val := false; END if; 
if (_author IS null) THEN 
	raise EXCEPTION 'пустой тип? так не пойдет'; 
	return_val := false; END if; 
if (_izdat IS null) THEN 
	raise EXCEPTION 'пустой тип? так не пойдет'; 
	return_val := false; END if; 
if (_god IS null) THEN 
	raise EXCEPTION 'пустой тип? так не пойдет'; 
	return_val := false; END if; 
	


OPEN tip_cursor (firstCursor :=newtip_name );
FETCH tip_cursor INTO new_tipid;
OPEN izd_cursor (secondCursor := new_izd);
FETCH izd_cursor INTO new_izdid;
OPEN otr_cursor (thirdCursor := newotr_name);
FETCH otr_cursor INTO new_otrid;

if ( new_otrid = -1)
THEN return_val = false;
end IF;
if (new_tipid = -1)
then return_val = false;
end if;
if (new_izdid = -1)
THEN return_val = FALSE;
end if;

if (return_val = true)
THEN
insert INTO документ ("название", "кол-во", "шифр типа",
"шифр издания", "шифр отрасли" ) values (doc_name, amount, new_tipid, new_izdid, new_otrid,  _author, _izdat, _god );
end if;
return return_val;
END; $function$ 



делаю запрос - выходит ошибка:
функция add_doc(unknown, integer, integer, integer, integer, unknown, unknown, integer) не существует
LINE 1: select*from add_doc('ABCdik',7, 7, 4, 15,'','timesnew',1777)
^
HINT: Функция с данными именем и типами аргументов не найдена. Возможно, вам следует добавить явные приведения типов.

с чем это связанно и как исправить?
7 июн 21, 15:51    [22332377]     Ответить | Цитировать Сообщить модератору
 Re: Функция с данными именем и типами аргументов не найдена. как исправить?  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1398
Eva2003
функция add_doc(unknown, integer, integer, integer, integer, unknown, unknown, integer) не существует
LINE 1: select*from add_doc('ABCdik',7, 7, 4, 15,'','timesnew',1777)


CREATE OR REPLACE FUNCTION public.add_doc(doc_name text, amount int,  newtip_name text, new_izd bool, newotr_name text, _author text, _izdat text, _god int )


И т.д. Если создаёте с типом text, значит передавайте текст '7'. Либо наоборот, определите параметр у функции как число. Проверьте остальные параметры.

Сообщение было отредактировано: 7 июн 21, 15:51
7 июн 21, 15:58    [22332384]     Ответить | Цитировать Сообщить модератору
 Re: Функция с данными именем и типами аргументов не найдена. как исправить?  [new]
Eva2003
Member

Откуда:
Сообщений: 3
VSVLAD,

поменяла запрос на:
select*from add_doc('ABCdik',7, 'studentbook', 1, 'english','И.Ь.Моисеев','timesnew',1777)

ошибка осталась та же
7 июн 21, 16:32    [22332415]     Ответить | Цитировать Сообщить модератору
 Re: Функция с данными именем и типами аргументов не найдена. как исправить?  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4785
Eva2003
VSVLAD,

поменяла запрос на:
select*from add_doc('ABCdik',7, 'studentbook', 1, 'english','И.Ь.Моисеев','timesnew',1777)

ошибка осталась та же


А зачем вы в bool - integer суете когда надо TRUE/FALSE ?

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
7 июн 21, 16:35    [22332418]     Ответить | Цитировать Сообщить модератору
 Re: Функция с данными именем и типами аргументов не найдена. как исправить?  [new]
Eva2003
Member

Откуда:
Сообщений: 3
Maxim Boguk,

потому что умом и сообразительностью я не отличаюсь и пишу на sql только второй день. Не знала, что у вас тут всё так строго(
изменила запрос на:
select*from add_doc('ABCdik',7,'studentbook', true, 'english','И.Ь.Моисеев','timesnew',1777)

стало только хуже :
ERROR: ОШИБКА: нулевое значение в столбце "шифр типа" нарушает ограничение NOT NULL
DETAIL: Ошибочная строка содержит (ABCdik, 7, null, 3, null, И.Ь.Моисеев, timesnew, 1777).
CONTEXT: SQL-оператор: "insert INTO документ ("название", "кол-во", "шифр типа",
"шифр издания", "шифр отрасли", "автор","издат-во","год изд-я" ) values (doc_name, amount, new_tipid, new_izdid, new_otrid, _author, _izdat, _god )"
функция PL/pgSQL add_doc(text,integer,text,boolean,text,text,text,integer), строка 55, оператор SQL-оператор
7 июн 21, 16:52    [22332428]     Ответить | Цитировать Сообщить модератору
 Re: Функция с данными именем и типами аргументов не найдена. как исправить?  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1398
И стало не хуже, а лучше. Функция по крайней мере начала исполняться, теперь ошибка вставки в таблицу. Поле "шифр типа" определено как not null, а значение подставляется из переменной new_tipid, которое судя по всему null.

А вообще этот блок не пойдёт:
if ( new_otrid = -1)
THEN return_val = false;
end IF;
if (new_tipid = -1)
then return_val = false;
end if;
if (new_izdid = -1)
THEN return_val = FALSE;
end if;


Если new_otrid и new_tipid будет -1, а new_izdid другое значение, тогда флаг return_val будет TRUE. Хотя технически проверка не пройдена. Вам нужно не
 return_val = FALSE; 

а
return false;

как минимум.

Сообщение было отредактировано: 7 июн 21, 17:22
7 июн 21, 17:30    [22332450]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить