-- Function: dbo.fn_getfioaccusative(uuid)
-- DROP FUNCTION fn_getfioaccusative(uuid);
DROP FUNCTION  IF EXISTS dbo.fn_GetFioAccusative;
CREATE FUNCTION dbo.fn_GetFioAccusative("Uid" uuid)
  RETURNS text AS
$BODY$
Declare Fam varchar(40);
	Ima varchar(40);
	Otc varchar(40);
	ManLstLt varchar(40);
	WmnLstLt varchar(40);
	ManFamEnd varchar(40);
	IiFamEnd varchar(40);
	WmnFamEnd varchar(40);
	Jud1FamEnd varchar(200);
	Jud2FamEnd varchar(100);
	Jud3FamEnd varchar(40);
	FranceFam varchar(100);
	LstLtIma varchar(40);
	LstTwoIma varchar(40);
	LstLtFam varchar(40);
	LstTwoFam varchar(40);
	LstTwoOtc varchar(40);
	Processed int;
	Sex varchar(40);
	lDefisPos  int;
	Vowels text;
	Hissing text;
 Begin
 -- Процедура GetDativ склонения ФИО получателя в дательном падеже (кому?).  
-- Версия 2.1 исправленная. Обсуждение проекта также здесь: http://gramota.ru/forum/read.php?f=7&i=1217&t=1217  
-- Приведенный код может содержать ошибки, но Вы можете свободно использовать его на свой страх и риск.  
-- Тестирование продолжается. Присылайте и пишите свои отзывы и замечания. Спасибо всем откликнувшимся!  
-- Полезные ссылки:  
-- Особенности склонения фамилий и личных имен http://spravka.gramota.ru/surnames.html Отсюда взяты правила!  
-- Склонение личных имен в русском языке http://www.nazovite.ru/sklonenie  
-- Cловари русского языка для скачивания http://dicts.alphanet.org.ua/  
-- По последней ссылке можно скачать в т.ч. словарь фамилий familii.exe 2,160,669 байт (7 миллионов фамилий)  
-- Книга: 'Склонение фамилий и личных имен в русском литературном языке.'  
-- Автор: Калакуцкая Л.П., Издание: М. ; Наука 1984г, Страниц: 221  
-- Книга: 'Современные русские фамилии.'  
-- Автор: Суперанская А.В., Суслова А.В. Издание: М. ; Наука 1981г, Страниц: 176  
-- На с. 120-122 последнего издания приводятся русские фамилии на 'ой', 'ий', 'ый', без показателя (суффикса) 'ск', как в фамилии КрамСКой) 

	select Into
		Fam, Ima, Otc
		p.LastName, p.FirstName, p.FatherName
	from akuz.T_PATIENT p
	where p.PatientID = "Uid";	

	if char_length(Otc) < 3 
	then return Fam || chr(32) || Ima || chr(32) || Otc; -- chr(32) - пробел
	end if;

	-- Список всех гласных букв русского алфавита (требуются для проверки букв, стоящих перед окончаниями сложных фамилий)  
	Vowels := 'АЕЁИОУЭЫЮЯ';
	-- Список шипящих букв, необходимых для правильного склонения фамилий, заканчивающихся на эта буква + 'ИЙ' или 'АЯ'  
	Hissing := 'ЧШЩ';
	-- Список последних букв, встречающихся в типичных мужских именах  
	-- ГлеБ,СлаВ,ОлеГ,ЭдуарД(АльфреД),ГилядЖ,ЧингиЗ,МарК,МихаиЛ,ВадиМ,ИваН,ЮсуП,ВиктоР,БориС(ФеликС),ФилареТ(МараТ),ИосиФ,АристарХ  
	ManLstLt := 'БВГДЖЗКЛМНПРСТФХ';
	-- Список последних букв, встречающихся в типичных женских именах  
	WmnLstLt := 'АЯЬ';  -- МаринА, АнастасиЯ, ИЯ (исключение), ЛюбовЬ  
	-- Список окончаний мужских славянских (русских) фамилий. На -ов фамилии отцовы, на -ин фамилии мамины.  	
	ManFamEnd := 'ЕВ ЁВ ИН ОВ ЫН';
	-- Список окончаний мужских славянских (русских) фамилий, заканчивающихся на 'Й'  
	-- Чисто русские фамилии без '-ск-': БлагОЙ,ТолстОЙ,БоровОЙ,БереговОЙ,ЛановОЙ,БроневОЙ,ДикИЙ,ГладкИЙ,ЛучшИЙ,ПоперечнЫЙ,...  
	-- Существует ряд воспринимаемых неоднозначно фамилии ТопчИЙ, ПобожИЙ, БокИЙ, РудОЙ и т.п.,  
	-- как имеющих окончания '-ий','-ой', и склоняющихся как прилагательные (ТопчИЙ->ТопчЕМУ /жен.ТопчЕЙ/)  
	-- или как с нулевым окончанием и склонением по образцу существительных (ТопчИЙ->ТопчИЮ /жен.ТопчИЙ/)  
	IiFamEnd := 'ИЙ ОЙ ЫЙ';  -- ГорькИЙ (ЖириновскИЙ), ДонскОЙ (МеньшОЙ, РябОЙ), ПоперечнЫЙ (СытЫЙ)  
	-- Список окончаний женских славянских фамилий  
	WmnFamEnd := 'АЯ ВА НА';  -- ПодольскАЯ, РубиноВА, КлепиниНА  
	-- СПИСОК N 1 ИНОСТРАННЫХ ФАМИЛИЙ, ОКАНЧИВАЮЩИХСЯ НА СОГЛАСНЫЙ ЗВУК, ДОПОЛНЯЮЩИХСЯ БУКВОЙ 'У' У МУЖЧИН  
	-- БессарАБ,КостопрАВ,КимчАГ,ТихолАЗ,СобчАК(КолчАК,ПастернАК),ХейердАЛ,КипермАН(НеждАН),НовАР,НикитАС,БАХ,КАЦ,  
	-- ВагнЕР(ГомЕР),СервантЕС,АврЕХ,СаркИЗ,ТютюннИК(ТаможеннИК),КИМ,ЭдИП,СабонИС,СмИТ,ЛифшИЦ,МаслиевИЧ,ЭЙН,ВоЛК,МаксвеЛЛ,  
	-- БраМС,ЛантиНГ,ГельфаНД,СаркисьяНЦ,МорОЗ,НиксОН(КлинтОН),РуссОС,кОХ,РезерфоРД,ОленбеРГ,НаймаРК,ЭйнгоРН,ПреСС,ЭрнСТ,МокрозУБ,  
	-- ЦингаУЗ,ШевчУК,СтУЛ,ЦикУН,МацкявичУС,БУШ,ЛинколЬН,ТизенголЬТ,ПелЬШ,БаландЮК,КЮН,ТретьЯК,ШамоЯН,МотЯС (пока 54 штуки)  	
	Jud1FamEnd := 'АБ АВ АГ АЗ АК АЛ АН АР АС АХ АЦ ЕР ЕС ЕХ ИЗ ИК ИМ ИП ИС ИТ ИЦ ИЧ ЙН ЛК ЛЛ МС НГ НД НЦ ОЗ ОН ОС ОХ РД РГ РК РН СС СТ УБ УЗ УК УЛ УН УС УШ ЬН ЬТ ЬШ ЮК ЮН ЯК ЯН ЯС';
	-- СПИСОК СКЛОНЯЕМЫХ НЕ РУССКИХ ФАМИЛИЙ N 2, заканчивающихся на гласные звуки А->Е и Я->Е, с предшествующей согласной  
	-- за исключением указанных ниже несклоняемых фамилий французского происхождения. Например:  
	-- ДзюБА,ГулыГА(МаГА,искл.ДеГА),НегоДА,ДюДЯ,ГамалЕЯ,ГлинКА(ДейнеКА,искл.ЛюКА),ИгЛА,,ЗозуЛЯ,КайМА(КарМА),КуралеНЯ,  
	-- МазеПА(искл.ПетиПА),ГализдРА(искл.ГамарРА),ОпРЯ,ТупоТА,ВаренуХА,ЛисиЦА,ОлеША  		 
	Jud2FamEnd := 'БА ГА ДА ДЯ ЕЯ КА ЛА ЛЯ МА НЯ ПА РА РЯ ТА ХА ЦА ША';  -- ... все на 'А' и 'Я' (здесь можно не пополнять)  
	-- СПИСОК НЕ РУССКИХ ФАМИЛИЙ N 3 (фамилии, заканчивающиеся на 'А[Й]'->'Ю', '[Ь]'->'Ю' и 'У[Й]'->'Ю' у мужчин)    
	-- МаклАЙ,ЛебеДЬ,ДруЗЬ,КоваЛЬ(ВрубеЛЬ,ГогоЛЬ,РозентаЛЬ,ЧерчилЛЬ),ОболоНЬ,ХемингуЭЙ,ХалУЙ		
	Jud3FamEnd := 'АЙ ДЬ ЕЙ ЗЬ ЛЬ НЬ ЭЙ УЙ';  -- ...  ЕЙ (кроме ВоробЕЙ, СоловЕЙ), а на 'Ь' - любые (здесь можно не пополнять)  
	-- Несклоняемые фамилии французского происхождения: ДеГА, ЛюКА, ДюМА (ТоМА, ФерМА), ПетиПА и ГамарРА и др.   	
	FranceFam := 'ДЕГА ЛЮКА ДЮМА ТОМА ФЕРМА ПЕТИПА ГАМАРРА ЗОЛЯ ТРУАЙА' || chr(32);
	
	-- Для проведения анализа при склонении нам потребуются:  
	LstLtIma := Upper(Right(Ima,1));  -- Последняя буква имени  
	LstTwoIma := case when char_length(Ima) > 1 then Upper(Right(Ima,2)) else Upper(Ima) end;  -- Последние две буквы имени  
	LstLtFam := Upper(Right(Fam,1));  -- Последняя буква фамилии  
	LstTwoFam := Upper(Right(Fam,2));  -- Последние две буквы фамилии  
	LstTwoOtc := Upper(Right(Otc,2)); -- Последние две буквы отчества  
	Processed := 0;  -- Признак того, что фамилия и имя еще не обработаны  
	Sex := '?';  -- Пол: 'М' - мужской, 'Ж' - женский, '?' - не определен достоверно.  
--raise notice 'LstLtIma = %', LstLtIma;
--raise notice 'LstLtIma = %', LstLtIma;
	-- Синтаксический разбор мужских и женских отчеств  
	-- И одновременная попытка определения пола человека  
	-- Также однозначно просклоняем отчество. Здесь нет трудностей.  
	If LstTwoOtc ='ИЧ' --Если отчество заканчивается на буквы 'ИЧ'  
	then	Otc := Upper(Left(Otc,1)) || Lower(substring(Otc from 2 for (Char_Length(Otc) - 1)))  || 'у'; --(даже Савельичу!)  
		Sex := 'М';
	end if;
	If Upper(Right(Otc, 1)) = 'А' -- Если отчество заканчивается на букву 'А'  
	then	Otc := Upper(Left(Otc, 1)) || Lower(substring(Otc from 2 for (Char_Length(Otc) - 2))) || 'е';
		Sex := 'Ж';
	end if;
	If Sex = '?'  
	then
	-- 'оглы' (для мужчин) и 'кызы' (для женщин) не склоняются и могут писаться  
	-- как через черточку, так и отдельно от первой части отчества (однозначно определяют пол),  
	-- то есть ФИО может состоять из 4 слов.  
		If strpos(Upper(Otc), 'ОГЛЫ') <> 0
		then	Sex := 'М';
		Else
			If strpos(Upper(Otc), 'КЫЗЫ') <> 0
			then	Sex := 'Ж';
			end if;
		end if;
	end if;
	If Sex = '?'  
	then
	-- 'оглы' (для мужчин) и 'кызы' (для женщин) не склоняются и могут писаться  
	-- как через черточку, так и отдельно от первой части отчества (однозначно определяют пол),  
	-- то есть ФИО может состоять из 4 слов.  
		if (Otc = '')
		then
			If upper(right(Fam, 1)) = 'В'
			then	Sex := 'М';
			Else
				If upper(right(Fam, 1)) = 'А'
				then	Sex := 'Ж';
				end if;
			end if;
		end if;
	end if;
	--select @Sex
	-- Кто знает как правильно обрабатывать 'ОГЛЫ', допишите свой код здесь ...  

	-- Синтаксический разбор мужских фамилий и имен  
	-- Если фамилия заканчивается на 'ЕВ','ЁВ','ИН','ОВ','ЫН','ИЙ','ОЙ','ЫЙ'  
	If strpos(ManFamEnd, LstTwoFam) <> 0 OR strpos(IiFamEnd, LstTwoFam) <> 0
	then 
		If Sex = 'М'  -- Если обрабатывается мужчина  
		then
			Processed = 1; -- Признак того, что фамилия и имя уже обработаны  
			-- Обработка мужской фамилии, заканчавающихся на 'Й' весьма разнообразен и полон исключений  
			-- ПодольскИЙ, ВИЙ, ОкИЙ, БокИЙ, ЭдипИЙ, ЛенскИЙ, ВислоБокИЙ, СинеокИЙ, ГлубокИЙ, ТолстОЙ, СытЫЙ, ВиднЫЙ  
			If strpos(IiFamEnd, LstTwoFam) <> 0  
			then
			-- Подобрано эмпирически, что фамилии на 'ИЙ' длиной от 1 до 6, должны склоняться как исключение 'БокИЙ'  
			-- Причем не помогает анализ предшествующей гласной. Так [БокИЙ] -> [БокИЮ], но [ВислоБокИЙ] -> [ВислоБокОМУ]  
			-- Предполагаем, что короткой фамилии ЭнскИЙ не существует, иначе она будет у нас склоняться неверно!  
    
			-- ПРАВИЛО РУССКОГО ЯЗЫКА: Фамилии с формальным показателем (суффиксом) -ск- (ДостоевСКий) склоняются  
			-- в мужском и женском роде и во множественном числе как прилагательные.  
				If LstTwoFam = 'ИЙ' AND Char_Length(Fam) < 6  -- ВИЙ, ОкИЙ, БокИЙ  ([ИЙ]->[ИЮ])  
				then	Fam := Upper(Left(Fam, 1)) || Lower(substring(Fam from 2 for (Char_Length(Fam) - 2))) || 'ю';
				Else  
				-- Необходимо обработать также случай [ИЙ]->[ЕМУ], помимо наиболее распространенного [ИЙ]->[ОМУ].  
				-- Например [ПодьячИЙ]->[ПодьячЕМУ], [ЛучшИЙ]->[ЛучшЕМУ], [СмотрящИЙ]->[СмотрящЕМУ]  
					If strpos(Upper(substring(Fam from (Char_Length(Fam)-2) for 1)), Hissing) <> 0 
					then	Fam := Upper(Left(Fam, 1)) || Lower(substring(Fam from 2 for (Char_Length(Fam)-3))) || 'ему';
					Else
						Fam := Upper(Left(Fam, 1)) || Lower(substring(Fam from 2 for (Char_Length(Fam)-3))) || 'ому';
					end if; 
				end if;
			Else  -- Все типично русские мужские фамилии склоняются по этой строке: 
				Fam := Upper(Left(Fam, 1)) || Lower(substring(Fam from 2 for (Char_Length(Fam)-1))) || 'у';
			end if;
			--------------------------------------- 
			-- Процедура обработки мужского имени  
			If strpos(ManLstLt, LstLtIma) <> 0   
			then
				Ima := 	CASE	WHEN Char_Length(Ima) = 1 THEN Upper(Ima)  
						WHEN Upper(Ima) = 'ЛЕВ' THEN Upper(Left(Ima, 1)) || 'ьву'    ---- Если Лев, то 'ЕВ'->'ЬВУ'  
						WHEN LstTwoIma = 'ЕЛ' THEN Upper(Left(Ima, 1)) || Lower(substring(Ima from 2 for (Char_Length(Ima) - 3))) || 'лу'     -- Если ПавЕЛ, то убираем коренную гласную 'Е' ('ЕЛ'->'ЛУ')  
						ELSE Upper(Left(Ima, 1)) || Lower(substring(Ima from 2 for (Char_Length(Ima) - 1))) || 'у' 
					end;  -- ИваН 
			Else
				Ima :=  Case	WHEN Char_Length(Ima) = 1 THEN Ima      
						WHEN (LstLtIma = 'А') OR (LstLtIma = 'Я') THEN Upper(Left(Ima, 1)) || Lower(substring(Ima from 2 for (Char_Length(Ima) - 2))) || 'е'    -- НикитА, КузьмА, ЛукА, ФомА, СаввА, ИлиЯ, ИльЯ  
						WHEN (LstLtIma = 'Й') OR (LstLtIma = 'Ь') THEN Upper(Left(Ima, 1)) || Lower(substring(Ima from 2 for (Char_Length(Ima) - 2))) || 'ю'  
						---- АлексеЙ,АнатолиЙ,АндреЙ,АркадиЙ,АрсениЙ,АртемиЙ,ВалериЙ,ВасилиЙ,ВиталиЙ,ГеннадиЙ,ГеоргиЙ,ГригориЙ,ДмитриЙ,  
						---- ЕвгениЙ,ЗиновиЙ,ИннокентиЙ,ЛаврентиЙ,МатвеЙ,МефодиЙ,МоисеЙ,НиколаЙ,СергеЙ,ТимофеЙ,ФеодосиЙ,ЮлиЙ,ЮриЙ  
						---- ГаделЬ,ГэмилЬ,ДжалилЬ,РафаэлЬ,ИгорЬ,КамилЬ,НаилЬ,ЛазарЬ,РавилЬ,РаилЬ,РасилЬ,ФаилЬ,ХалилЬ,ШамилЬ,ЭмилЬ,ЯлилЬ,ЯмилЬ  
						ELSE ''
					end;  
				---- ---------------------------------
			end if; -- Sex='М'  
		end if;
	end if;  
	-- select @Fam, @Ima, @Otc
	-- Синтаксический разбор женских фамилий и имен  
	If strpos(WmnFamEnd, LstTwoFam) <> 0  -- Если фамил. зак-тся на 'АЯ','ВА','НА',проверим посл.букву имени  
	then 
		If Sex = 'Ж'  -- Если обрабатывается женщина  
		then
			Processed := 1;  -- Признак того, что фамилия и имя уже обработаны  
			-- Обработка женской фамилии  
			If LstTwoFam = 'АЯ'  -- Касат[АЯ->ОЙ], Гурцк[АЯ->ОЙ] но Лучш[АЯ->ЕЙ] и Цхак[АЯ->АЯ]  
			then
			-- Необходимо обработать также случай [АЯ]->[ЕЙ], помимо наиболее распространенного [АЯ]->[ОЙ].  
			-- Например [ПодьячАЯ]->[ПодьячЕЙ], [ЛучшАЯ]->[ЛучшЕЙ], [СмотрящАЯ]->[СмотрящЕЙ]  
				If strpos(Hissing, Upper(substring(Fam from (Char_Length(Fam) - 2) for 1))) <> 0
				then
					Fam := Upper(Left(Fam, 1)) || Lower(substring(Fam from 2 for (Char_Length(Fam) - 3))) || 'ей';
				Else
					If NOT(Upper(Right(Fam, 4)) = 'АКАЯ') -- Грузинская фамилия типа 'Цхакая'  
					then	Fam := Upper(Left(Fam, 1)) || Lower(substring(Fam from 2 for (Char_Length(Fam) - 3))) || 'ой';
					end if;
				end if;
			Else	-- Самый массовый случай русских женских фамилий, например, КольцоВ[А->ОЙ]  
				-- Но сюда могут 'закрасться' грузинские женские фамилии, типа 'Окуджава', проверим дополнительно!  
				If Upper(Right(Fam, 3)) = 'АВА' 
				then	
					Fam := Upper(Left(Fam, 1)) || Lower(substring(Fam from 2 for (Char_Length(Fam) - 2))) || 'е';
				Else  
					Fam := Upper(Left(Fam, 1)) || Lower(substring(Fam from 2 for (Char_Length(Fam) - 2))) || 'ой';
				end if;
			end if; 
			--------------------------------------------------------------  
			-- Процедура обработки женского склоняемого имени,  
			-- т.е. не такого как несклоняемые имена: Жаклин, Каринэ, Нелли и т.п.  
			If strpos(WmnLstLt, LstLtIma) <> 0 AND Char_Length(Ima) > 1 -- Если имя зак-тся на 'А','Я' или 'Ь'  
			then
				If Upper(Right(Ima, 2)) = 'ИЯ'  -- Имя оканчивается на -ия,  
				then
					If Upper(Ima) = 'ИЯ'  
					then
						-- Мою супругу зовут 'Ия' (в переводе с греч.'Фиалка'). Это 'особый' случай!  
						Ima := 'Ие';
					Else  
						-- Если имя не Ия, то -ия заменяется на -ии, например, [ЛилИЯ]->[ЛилИИ]  
						Ima := Upper(Left(Ima, 1)) || Lower(substring(Ima from 2 for (Char_Length(Ima) - 3))) || 'ии';
					end if;
				Else
					If LstLtIma <> 'Ь'  -- СветланА, ДарьЯ  
					then
						Ima := Upper(Left(Ima, 1)) || Lower(substring(Ima from 2 for (Char_Length(Ima) - 2))) || 'е';
					Else  -- ЛюбовЬ, НинелЬ  
						Ima := Upper(Left(Ima, 1)) || Lower(substring(Ima from 2 for (Char_Length(Ima) - 2))) || 'и';
					end if;
				end if;
			end if;
			----------------------------------------- 
		end if; --- Sex='Ж'  
	end if;
	--select @Fam, @Ima, @Otc  

	-- Синтаксический разбор украинских и некоторых других фамилий и имен на 3-ем проходе  
	If Processed = 0  -- Если фамилия и имя еще не обработаны
	then
	---- Вполне достоверно утверждение с сайта http://community.livejournal.com/ru_programming/478385.html#comments,  
	---- что женские фамилии, оканчивающиеся на согласный звук и мягкий знак не склоняются, а фамилии,  
	---- оканчивающиеся на гласный звук склоняются не зависимо от пола, с учетом следующих двух правил:  
    
	---- ПРАВИЛО 1: Все фамилии, пишущиеся с е, э, и, ы, у, ю на конце, могут быть только несклоняемыми.  
	---- Таковы фамилии: ДоДЕ, МавроДИ(КеннеДИ,ГанДИ), АмаДУ, ОрджоникидЗЕ, ШабрИЕ, МеЙЕ, НасоновсКИ,  
	---- ЧаушесКУ, НобиЛЕ(КараджаЛЕ,ТарЛЕ), ЛюлЛИ(ШелЛИ,РуставеЛИ), НеедЛЫ, КаМЮ, АртмаНЕ,   
	---- АхвледиаНИ(МодильяНИ,ЧабукиаНИ), ЛаНУ, КорНЮ, НавОИ, ШОУ, ЛансеРЕ, ХараРИ(ГретРИ), НеРУ,  
	---- МегРЭ, МюсСЕ, ДебюсСИ(ГолсуорСИ), ГёТЕ(ОрбакайТЕ), ДжусойТЫ, МанЦУ, ГрамШИ, БоссЮЭ, ФурЬЕ,...  
    
	---- ПРАВИЛО 2: Все фамилии, оканчивающиеся на а, которому предшествуют гласные звуки (чаще всего у или и), несклоняемы:  
	---- Галуа, Моруа, Делакруа, Моравиа, Эриа, Эредиа, Гулиа.  
    
	---- ПРАВИЛО 3: Несклоняемы фамилии французского происхождения с ударением на конце: ЗоЛЯ, ТруаЙА.   
	---- Все прочие фамилии на '-я' склоняемы; таковы ГоловНЯ, ЗозуЛЯ, СырокомЛЯ, ГамалЕЯ, ГоЙЯ, ШенгелАЯ,  
	---- ДанелИЯ, БерИЯ, БакерИЯ, ИверИЯ.   
	---- Грузинские фамилии оказываются склоняемыми или несклоняемыми в зависимости от того, в каком виде  
	---- конкретная фамилия заимствована русским языком: фамилии на -ия склоняемы (Данелия), на -иа - несклоняемы (Гулиа).  
    
	---- Нерусский список N2 (Jud2FamEnd) фамилий, заканчивающихся на гласные звуки 'А', 'Я' с предшествующей согласной,  
	---- кроме исключений, состоящих из фамилий французского происхождения (FranceFam), таких как ФерМА и т.п.  
    
		If ((LstLtFam = 'А' AND LstTwoFam <> 'ИА' AND LstTwoFam <> 'УА') OR LstLtFam = 'Я') AND 
			LstLtFam <> 'Е' AND LstLtFam <> 'Э' AND LstLtFam <> 'И' AND LstLtFam <> 'Ы' AND LstLtFam <> 'У' AND LstLtFam <> 'Ю' AND  
			strpos(FranceFam, Upper(Fam) || chr(32)) = 0
		then
			If LstTwoFam = 'ИЯ'  -- Склоняем грузинские фамилии на 'ИЯ'. Нам это разрешает делать правило!  
			then
				Fam := Upper(Left(Fam, 1)) || Lower(substring(Fam from 2 for (Char_Length(Fam) - 2))) || 'и';
			Else  -- Склоняем остальные склоняемые фамилии, заканчивающиеся на гласную из списка Jud2FamEnd  
				Fam := Upper(Left(Fam, 1)) || Lower(substring(Fam from 2 for (Char_Length(Fam) - 2))) || 'е';
			end if;
		end  if;
		if Sex = 'М'  -- Обрабатываем мужчину  
		-- Нерусский список N1 (Jud1FamEnd)  
		then
			If strpos(Jud1FamEnd, LstTwoFam) <> 0  
			then
				Fam := Upper(Left(Fam, 1)) || Lower(substring(Fam from 2 for (Char_Length(Fam) - 1))) || 'у';
			end if; 
			-- Нерусский список N3 (Jud3FamEnd)  
			If Upper(Fam) = 'СОЛОВЕЙ' OR Upper(Fam) = 'ВОРОБЕЙ'  -- СОЛОВЕЙ, ВОРОБЕЙ (исключение)
			then
				Fam := Upper(Left(Fam,1)) || Lower(substring(Fam from 2 for (Char_Length(Fam) - 3))) || 'ью';
			Else  
				-- Список Jud3FamEnd ++  
				If LstTwoFam = 'АЙ' OR LstTwoFam = 'ЕЙ' OR LstTwoFam = 'УЙ' OR LstTwoFam = 'ЭЙ' OR LstLtFam = 'Ь'  
				then
					Fam := Upper(Left(Fam, 1)) || Lower(substring(Fam from 2 for (Char_Length(Fam) - 2))) || 'ю';
				end if; 
			end if; 
			If LstTwoFam = 'ЕЦ'  
			then
			---- Необходимо определять согласная или гласная буква находится перед 'ЕЦ'  
			---- МогилеВец, БоРец, КоБец (подвид 1 с предшествующим согласным звуком) [ЕЦ]->[ЦУ],  
			---- БОец, КоломИец (подвид 2 с предшествующим гласным звуком /Vowels/)   [ЕЦ]->[ЙЦУ]  
				If strpos(Vowels, Upper(substring(Fam from (Char_Length(Fam) - 2) for 1))) = 0  
				then
					Fam := Upper(Left(Fam, 1)) || Lower(substring(Fam from 2 for (Char_Length(Fam) - 3))) || 'цу';
				Else 
					Fam := Upper(Left(Fam, 1)) || Lower(substring(Fam from 2 for (Char_Length(Fam) - 3))) || 'йцу';
				end if;
			end if;
			---- КлюченОК,КовалЕнОК,МАзОК,МазурЕнОК,МазУрОК,МакарЕнОК,МакеЕнОК,МалашОнОК,МаскОлОК [ОК->КУ]  
			---- БаЙрОК[+У],БайЧтОК[+У],БлОК[+У],КоЛеОК[+У],КоЛтОК[+У],КосТлОК[+У],МаЛоОК[+У],ТененШтОК[+У],ТеСмОК[+У]  
			---- КоРшОК (МакАшОК, МалАшОК, ТерЕшОК, ТимОшОК) [ОК->КУ] (перед ОК стоит шипящая Ш)  
			If LstTwoFam = 'ОК'  
			then
			---- 'ОК' склоняем только у мужчин. Могут быть 2 случая:  
			---- 1 случай: КлюченОК [ОК->КУ]  
			---- 2 случай: БлОК [ОК->ОКУ]  
			---- Подмеченная закономерность (попробуйте опровергнуть - вряд ли удастся!):  
			---- Если 3-я с конца буква фамилии на 'ОК' есть буква 'Ш' или 4-я с конца буква гласная, то [ОК->КУ]  
				If Char_Length(Fam) > 3 AND (Upper(substring(Fam from (char_length(Fam) - 3) for 1)) = 'Ш' OR strpos(Vowels, Upper(substring(Fam from (Char_Length(Fam) - 4) for 1))) <> 0)  
				then
					Fam := Upper(Left(Fam, 1)) || Lower(substring(Fam from 2 for (Char_Length(Fam) - 3))) || 'ку';
				Else  --[ОК->ОКУ]  
					Fam := Upper(Left(Fam, 1)) || Lower(substring(Fam from 2 for (Char_Length(Fam) - 1))) || 'у';
				end if; 
			end if;
			---- 'ЕК' склоняем только у мужчин.  
			---- ЗДЕСЬ МЕНЯ ТЕРЗАЮТ СИЛЬНЫЕ СОМНЕНИЯ, НО ВЕСЬМА ПОХОЖЕ НА ТО, ЧТО ВЕЗДЕ ДЕЛАТЬ НУЖНО ИМЕННО ТАК:  
			---- КраснОщЕК[+У],КрЯчЕК[+У]. (?) ВанИчЕК[+У],ВасИлЕК[+У],КрЮчЕК[+У],МалЫшЕК[+У] (?)  
			If LstTwoFam = 'ЕК'
			then	
				Fam := Upper(Left(Fam, 1)) || Lower(substring(Fam from 2 for (char_length(Fam) - 1))) || 'у';
			end if; 
			----------------------------------------------  
			--------------- Процедура обработки мужского имени  
			If strpos(ManLstLt, LstLtIma) <> 0  
			then
				Ima :=	Case	when Char_Length(Ima) = 1 
						Then Upper(Ima)
						when Upper(Ima) = 'ЛЕВ'   -- Если Лев, то 'ЕВ'->'ЬВУ'  
						then Upper(Left(Ima, 1)) || 'ьву'  
						when LstTwoIma = 'ЕЛ' --Если ПавЕЛ, то убираем коренную гласную 'Е' ('ЕЛ'->'ЛУ')
						then Upper(Left(Ima, 1)) || Lower(substring(Ima from 2 for (Char_Length(Ima) - 3))) || 'лу'  
						else Upper(Left(Ima, 1)) || Lower(substring(Ima from 2 for (Char_Length(Ima) - 1))) || 'у' 
					end;
			Else
				Ima :=	Case	when Char_Length(Ima) = 1
						Then Upper(Ima)
						when LstLtIma = 'А' OR LstLtIma = 'Я'  -- НикитА, КузьмА, ЛукА, СаввА, ИлиЯ, ИльЯ  
						then Upper(Left(Ima, 1)) || Lower(substring(Ima from 2 for (Char_Length(Ima) - 2))) || 'е'
						------ АлексеЙ,АнатолиЙ,АндреЙ,АркадиЙ,АрсениЙ,АртемиЙ,ВалериЙ,ВасилиЙ,ВиталиЙ,ГеннадиЙ,ГеоргиЙ,ГригориЙ,ДмитриЙ,  
						---- ЕвгениЙ,ЗиновиЙ,ИннокентиЙ,ЛаврентиЙ,МатвеЙ,МефодиЙ,МоисеЙ,НиколаЙ,СергеЙ,ТимофеЙ,ФеодосиЙ,ЮлиЙ,ЮриЙ  
						---- ГаделЬ,ГэмилЬ,ДжалилЬ,РафаэлЬ,ИгорЬ,КамилЬ,НаилЬ,ЛазарЬ,РавилЬ,РаилЬ,РасилЬ,ФаилЬ,ХалилЬ,ШамилЬ,ЭмилЬ,ЯлилЬ,ЯмилЬ  
						when LstLtIma = 'Й' OR LstLtIma = 'Ь'
						then Upper(Left(Ima, 1)) || Lower(substring(Ima from 2 for (Char_Length(Ima) - 2))) || 'ю'
						else ''
					end;
			end if;
		end if;
		------------------------------------  
		if Sex = 'Ж'  -- Обрабатываем женщину 
		then
		---- Не русскую женскую фамилию склонять не надо  
		----------------------------------------------------------------------------------------------------------------------------  
		---- Процедура обработки женского склоняемого имени,  
		---- т.е. не такого как несклоняемые имена: Жаклин, Каринэ, Нелли и т.п.  
			If strpos(WmnLstLt, LstLtIma) <> 0 AND Char_Length(Ima) > 1 -- Если имя зак-тся на 'А','Я' или 'Ь'  
			then 
				If Upper(Right(Ima, 2)) = 'ИЯ'  -- Имя оканчивается на -ия (ЛилИЯ),  
				then
					If Upper(Ima) = 'ИЯ'  
					then
						-- Мою супругу зовут 'Ия' (в переводе с греч.'Фиалка'). Это 'особый' случай!  
						Ima := 'Ие';
					Else  
						-- Если имя не Ия, то -ия заменяется на -ии, например, [ЛилИЯ]->[ЛилИИ]  
						Ima := Upper(Left(Ima, 1)) || Lower(substring(Ima from 2 for (Char_Length(Ima) - 3))) || 'ии';
					end if;
				Else  
					If LstLtIma <> 'Ь'  -- СветланА, ДарьЯ
					then
						Ima := Upper(Left(Ima, 1)) || Lower(substring(Ima from 2 for (Char_Length(Ima) - 2))) || 'е';
					Else  -- ЛюбовЬ, НинелЬ  
						Ima := Upper(Left(Ima, 1)) || Lower(substring(Ima from 2 for (Char_Length(Ima) - 2))) || 'и';
					end if;
				end if;
			end if;
		--------------------------------------------------------------------------------------------------------------------------   
		-- Обработка фамилий пишущихся через дефис (Миклухо-Маклай, Кох-Татаренко, ...)  
			lDefisPos := strpos(Fam, '-');
			If lDefisPos > 1
			then
				Fam := Left(Fam, lDefisPos) || Upper(substring(Fam from (lDefisPos + 1) for 1)) || Right(Fam, Char_Length(Fam) - lDefisPos - 1);
			end if;
		-- Формируем фамилию, имя и отчество в дательном падеже  
		--Return AllT(Fam + Space(1) + Ima + Space(1) + Otc)  
		end if;
	end if;
	return coalesce(Fam || chr(32),'') || coalesce(Ima || chr(32), '') || coalesce(Otc, '');	
END $BODY$
  LANGUAGE plpgsql IMMUTABLE
  COST 100;
ALTER FUNCTION dbo.fn_getfioaccusative(uuid)
  OWNER TO postgres;
