CREATE OR REPLACE FUNCTION blank_insert(IN p_fio character varying, IN p_address1 character varying, IN p_address2 character varying, IN p_f character varying, IN p_city character varying, IN p_weight numeric, IN p_pay_post money, IN p_pay_all money, IN p_pay_show money, IN p_barcode character, OUT p_result integer)
RETURNS integer AS
$BODY$begin
//тут чето делаем
end;$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION blank_insert(character varying, character varying, character varying,character varying, character varying, numeric, money, money, money, character) OWNER TO postgres;
Проблема с TADOStoredProc в postgreSQL. Unknown-тип данных в функции.
Код:
Используется UNICODE-версия драйвера.
На стороне клиента параметры имеют тип ftWideString (либо ftFixetChar - роли не играет).
При вызове процедуры - получаю сообщение:
Цитата:
"... функция blank_insert("unknown","unknown","unknown","unknown","unknown", double precision,double precision,double precision,double precision,"unknown") не существует"
скорей всего гдето намутил с параметрами. Может кто подскажет?
у тебя одного параметра не хватает при вызове, я так полагаю. того, что integer
Цитата: Тень Пса
у тебя одного параметра не хватает при вызове, я так полагаю. того, что integer
Да вроде как не в этом дело. Тем более, что он объявлен как возращаемый. Почему то сервер считает, что данный тип не определен.
Но тоже попробовал:
Выполняю следующий скрипт:
Код:
select blank_insert('test','test','test','test','test',3.456,3.45,3.45,3.45,'123456',1);
в ответ получаю сообщение о ошибке:
Код:
********** Error **********
ERROR: функция blank_insert("unknown", "unknown", "unknown", "unknown", "unknown", numeric, numeric, numeric, numeric, "unknown", integer) не существует
SQL state: 42883
Hint: No function matches the given name and argument types. You may need to add explicit type casts.
Character: 8
ERROR: функция blank_insert("unknown", "unknown", "unknown", "unknown", "unknown", numeric, numeric, numeric, numeric, "unknown", integer) не существует
SQL state: 42883
Hint: No function matches the given name and argument types. You may need to add explicit type casts.
Character: 8
Выполняю преобразование:
Код:
select blank_insert('test'::varchar,'test'::varchar,'test'::varchar,'test'::varchar,'test'::varchar,3.456::double precision,3.45::double precision,3.45::double precision,3.45::double precision,'123456'::varchar);
получаю следующее сообщение:
Код:
ERROR: функция blank_insert(character varying, character varying, character varying, character varying, character varying, double precision, double precision, double precision, double precision, character varying) не существует
SQL state: 42883
Hint: No function matches the given name and argument types. You may need to add explicit type casts.
Character: 8
SQL state: 42883
Hint: No function matches the given name and argument types. You may need to add explicit type casts.
Character: 8
Да как же сцуко не существует? Вот же она:
Код:
CREATE OR REPLACE FUNCTION blank_insert(IN p_fio character varying, IN p_address1 character varying, IN p_address2 character varying, IN p_f character varying, IN p_city character varying, IN p_weight numeric, IN p_pay_post money, IN p_pay_all money, IN p_pay_show money, IN p_barcode character, OUT p_result integer)
RETURNS integer AS
$BODY$begin
insert into spr_castomers values (nextval('spr_castomers_item_id_seq'),p_fio,p_address1,p_address2,p_f,p_city);
p_result := currval('spr_castomers_item_id_seq');
insert into doc_item values (nextval('doc_item_item_id_seq'),NULL,p_result,p_weight,p_pay_post,p_pay_all,p_pay_show,p_barcode);
p_result := currval('doc_item_item_id_seq');
end;$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION blank_insert(character varying, character varying, character varying, character varying, character varying, numeric, money, money, money, character) OWNER TO postgres;
RETURNS integer AS
$BODY$begin
insert into spr_castomers values (nextval('spr_castomers_item_id_seq'),p_fio,p_address1,p_address2,p_f,p_city);
p_result := currval('spr_castomers_item_id_seq');
insert into doc_item values (nextval('doc_item_item_id_seq'),NULL,p_result,p_weight,p_pay_post,p_pay_all,p_pay_show,p_barcode);
p_result := currval('doc_item_item_id_seq');
end;$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION blank_insert(character varying, character varying, character varying, character varying, character varying, numeric, money, money, money, character) OWNER TO postgres;
Выполняю четкое приведение типов:
Код:
select blank_insert('test'::varchar,'test'::varchar,'test'::varchar,'test'::varchar,'test'::varchar,3.456::numeric,'3.45'::money,'3.45'::money,'3.45'::money,'123456'::char(8));
Получаю искомый результат. Вопрос - почему не выполняется приведение в TADOStoredProc? Либо какие типы надо использовать?
Код:
CAST ('test' AS varchar), CAST (10 AS numeric) и тд.
и, раз работает чёткое приведение типов, то зачем пользовать double precision вместо money, например. Или оно работает напрямую в postgre, а не в TADOStoredProc?
Цитата: Тень Пса
а попробуй преобразовывать так:
и пока убрать выходной параметр.
Код:
CAST ('test' AS varchar), CAST (10 AS numeric) и тд.
а в чем разница? По сути и то и другое - преобразование - причем никаким образом не отличается. Вопрос в том - отчего оно вообще понадобилось, как этой ситуации избежать?
Цитата: Тень Пса
и, раз работает чёткое приведение типов, то зачем пользовать double precision вместо money, например. Или оно работает напрямую в postgre, а не в TADOStoredProc?
а вот хз. С этим и пытаюсь разобраться :)
Использование double precision - проблему решило. Вероятно так же можно было бы воспользоваться явным приведением типов, как показано выше.
Но столкнулся со следующим багом (фичей) - в предствлении использовал коннектацию строк - так вот при попытке отобразить данные в гриде - приложение выпадало с ошибкой доступа.
Источник проблемы был найден путем последовательного добавления полей. Никто с таким не сталкивался? Это глюк юникодовского драйвера?