powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему хранимка не возвращает тип varchar(254) ?
9 сообщений из 9, страница 1 из 1
Почему хранимка не возвращает тип varchar(254) ?
    #35269299
strizh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть база, которая отлично работала на 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
Почему хранимка не возвращает тип varchar(254) ?
    #35269349
SeniorAndre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В самом ODBC драйвере есть настройка.... ,а что считать Memo, а что VarChar. Я тоже считаю очень не удобно.... Хдёшь один тип, а приходит другой...
...
Рейтинг: 0 / 0
Почему хранимка не возвращает тип varchar(254) ?
    #35269615
strizh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не в настройке ODBC дело.
Пробовал играться флажками - эффект 0.
...
Рейтинг: 0 / 0
Почему хранимка не возвращает тип varchar(254) ?
    #35270038
ЯЕХХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
strizhODBC 8.01.02
Почему именно эта версия psqlODBC? Вроде 8.03 последняя
...
Рейтинг: 0 / 0
Почему хранимка не возвращает тип varchar(254) ?
    #35270166
SeniorAndre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так... это... , а поле MaxVarChar менял?
...
Рейтинг: 0 / 0
Почему хранимка не возвращает тип varchar(254) ?
    #35270699
strizh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Почему именно эта версия psqlODBC? Вроде 8.03 последняя
Обновил

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

Проблема осталась. Фигня какая-то нездоровая :(
...
Рейтинг: 0 / 0
Почему хранимка не возвращает тип varchar(254) ?
    #35270879
SeniorAndre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитай соседню тему 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
Почему хранимка не возвращает тип varchar(254) ?
    #35271035
strizh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мдя. Придется перелопачивать клиента и везде вставлять касты на varchar.
...
Рейтинг: 0 / 0
Почему хранимка не возвращает тип varchar(254) ?
    #35271212
SeniorAndre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выше приведённый код не требовал переделак на клиенте..
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему хранимка не возвращает тип varchar(254) ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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