Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему хранимка не возвращает тип varchar(254) ? / 9 сообщений из 9, страница 1 из 1
21.04.2008, 17:22
    #35269299
strizh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему хранимка не возвращает тип varchar(254) ?
Есть база, которая отлично работала на 7.4.x. Клиентское приложение - на VFP 6, ODBC. Появилась насущная необходимость перенести базу на PgSQL 8 (из-за необходимости поддержки SSL). Перенес, все работает. Одна странная проблема нарисовалась. Не пойму, почему тип данных varchar странно себя ведет.
Например, есть хранимка:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create or replace function GetCorrespondentName(char( 20 ), char( 20 ), integer[ 8 ], integer[ 8 ]) returns varchar( 254 ) as '
   -- как параметры приходят балансовые счета дебета, кредита, последовательности аналитик дебета и кредита
   declare stBSDB alias for $1; stBSKR alias for $2; iArrAnaliticsDB alias for $3; iArrAnaliticsKR alias for $4;
   iType integer; iCode integer; stRet varchar(254);
begin
БЛА-БЛА-БЛА;
   return stRet::varchar(254);
end; ' language 'plpgsql' with (iscachable);
По всей логике, она должна возвращать тип varchar.
На клиенте запрос:
select GetCorrespondentName(...) from ...
Результат - колонка типа text вместо varchar(254). Соответственно, приложение показывает его как <memo>
Если указать еще одно явное преобразование на клиенте:
select GetCorrespondentName(...)::varchar(254) from ...
То все ОК. И таких процедур в базе - десятка 3. А уж мест в клиенте, где они используются - и вовсе ... Неохота всего клиента перелопачивать ... Подскажите, где роги !

Пробовал на PgSQL 8.1.6 (Linux) и 8.1.10 (WinXP)
ODBC 8.01.02
...
Рейтинг: 0 / 0
21.04.2008, 17:31
    #35269349
SeniorAndre
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему хранимка не возвращает тип varchar(254) ?
В самом ODBC драйвере есть настройка.... ,а что считать Memo, а что VarChar. Я тоже считаю очень не удобно.... Хдёшь один тип, а приходит другой...
...
Рейтинг: 0 / 0
21.04.2008, 18:58
    #35269615
strizh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему хранимка не возвращает тип varchar(254) ?
Не в настройке ODBC дело.
Пробовал играться флажками - эффект 0.
...
Рейтинг: 0 / 0
22.04.2008, 03:20
    #35270038
ЯЕХХ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему хранимка не возвращает тип varchar(254) ?
strizhODBC 8.01.02
Почему именно эта версия psqlODBC? Вроде 8.03 последняя
...
Рейтинг: 0 / 0
22.04.2008, 08:58
    #35270166
SeniorAndre
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему хранимка не возвращает тип varchar(254) ?
Так... это... , а поле MaxVarChar менял?
...
Рейтинг: 0 / 0
22.04.2008, 11:41
    #35270699
strizh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему хранимка не возвращает тип varchar(254) ?
>Почему именно эта версия psqlODBC? Вроде 8.03 последняя
Обновил

>Так... это... , а поле MaxVarChar менял?
Менял - увеличивал, уменьшал чуток ... И в хранимках уменьшал до varchar(200).

Проблема осталась. Фигня какая-то нездоровая :(
...
Рейтинг: 0 / 0
22.04.2008, 12:25
    #35270879
SeniorAndre
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему хранимка не возвращает тип varchar(254) ?
Прочитай соседню тему http://]http://www.sql.ru/forum/actualthread.aspx?tid=549624 та всё об том же... явно указывай возвращаемый тип при написании селекта и будет счастье...

У меня вообще вот такой вариант работает нормально
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
-- Function: get_employer_fio(bpchar, integer)

-- DROP FUNCTION get_employer_fio(bpchar, integer);

CREATE OR REPLACE FUNCTION get_employer_fio(pc_employerid bpchar, pi_typename integer)
  RETURNS character varying AS
$BODY$ 
/*
Возврат - СТРИНГ - EmployerFIO по входной pc_employerid
флаг pi_typename указывает на то, как будут представлены: 
	0 - И.О.
	1 - Имя Отчество
*/       

  DECLARE cReturn VARCHAR( 60 );
BEGIN 
    SELECT RTRIM(e.Family)||' '||
		CASE WHEN pi_typename= 0  THEN substring(e.FirstName, 1 , 1 )||'.' ELSE RTRIM(e.FirstName) END ||
		CASE  WHEN e.LastName IS NOT NULL  THEN 
			CASE WHEN pi_typename= 0  THEN substring(e.LastName, 1 , 1 )||'.' ELSE RTRIM(e.LastName) END ELSE '' END INTO cReturn
    FROM Employer e
   WHERE e.EmployerID=pc_employerid;
   IF cReturn IS NULL THEN
		cReturn:='';
   END IF;
   RETURN cReturn;
END$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST  100 ;
ALTER FUNCTION get_employer_fio(bpchar, integer) OWNER TO postgres;
GRANT EXECUTE ON FUNCTION get_employer_fio(bpchar, integer) TO public;
GRANT EXECUTE ON FUNCTION get_employer_fio(bpchar, integer) TO postgres;
GRANT EXECUTE ON FUNCTION get_employer_fio(bpchar, integer) TO "ctuUserRole";

А может у тебя где БлаБлаБла возвращается NULL??? :) И тогда могут быть непонятки с типом...
...
Рейтинг: 0 / 0
22.04.2008, 13:01
    #35271035
strizh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему хранимка не возвращает тип varchar(254) ?
Мдя. Придется перелопачивать клиента и везде вставлять касты на varchar.
...
Рейтинг: 0 / 0
22.04.2008, 13:45
    #35271212
SeniorAndre
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему хранимка не возвращает тип varchar(254) ?
Выше приведённый код не требовал переделак на клиенте..
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему хранимка не возвращает тип varchar(254) ? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]