Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с TADOStoredProc в postgreSQL. Unknown-тип данных в функции.

1
22 января 2010 года
kot_
7.3K / / 20.01.2000
База данных работает в кодировке UTF-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
//тут чето делаем
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;

Используется UNICODE-версия драйвера.
На стороне клиента параметры имеют тип ftWideString (либо ftFixetChar - роли не играет).
При вызове процедуры - получаю сообщение:
Цитата:
"... функция blank_insert("unknown","unknown","unknown","unknown","unknown", double precision,double precision,double precision,double precision,"unknown") не существует"


скорей всего гдето намутил с параметрами. Может кто подскажет?

92
25 января 2010 года
Тень Пса
2.2K / / 19.10.2006
у тебя одного параметра не хватает при вызове, я так полагаю. того, что integer
1
25 января 2010 года
kot_
7.3K / / 20.01.2000
Цитата: Тень Пса
у тебя одного параметра не хватает при вызове, я так полагаю. того, что 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


Выполняю преобразование:
 
Код:
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

Да как же сцуко не существует? Вот же она:
 
Код:
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;

Выполняю четкое приведение типов:
 
Код:
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? Либо какие типы надо использовать?
92
25 января 2010 года
Тень Пса
2.2K / / 19.10.2006
а попробуй преобразовывать так:
 
Код:
CAST ('test' AS varchar), CAST (10 AS numeric) и тд.
и пока убрать выходной параметр.

и, раз работает чёткое приведение типов, то зачем пользовать double precision вместо money, например. Или оно работает напрямую в postgre, а не в TADOStoredProc?
1
25 января 2010 года
kot_
7.3K / / 20.01.2000
Цитата: Тень Пса
а попробуй преобразовывать так:
 
Код:
CAST ('test' AS varchar), CAST (10 AS numeric) и тд.
и пока убрать выходной параметр.


а в чем разница? По сути и то и другое - преобразование - причем никаким образом не отличается. Вопрос в том - отчего оно вообще понадобилось, как этой ситуации избежать?

Цитата: Тень Пса

и, раз работает чёткое приведение типов, то зачем пользовать double precision вместо money, например. Или оно работает напрямую в postgre, а не в TADOStoredProc?


а вот хз. С этим и пытаюсь разобраться :)

1
25 января 2010 года
kot_
7.3K / / 20.01.2000
Вобщем проблема была с использованием в параметрах типов money и т.д.
Использование double precision - проблему решило. Вероятно так же можно было бы воспользоваться явным приведением типов, как показано выше.
Но столкнулся со следующим багом (фичей) - в предствлении использовал коннектацию строк - так вот при попытке отобразить данные в гриде - приложение выпадало с ошибкой доступа.
Источник проблемы был найден путем последовательного добавления полей. Никто с таким не сталкивался? Это глюк юникодовского драйвера?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог