- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
CREATE OR REPLACE FUNCTION "GET_SOTR_FULL_NAME" (sotr_id in number)
RETURN varchar2 IS
cursor surname (sotr_id number)
is
select fc_fam from tsotr
where tsotr.fk_id=sotr_id;
cursor name (sotr_id number)
is
select fc_name from tsotr
where tsotr.fk_id=sotr_id;
cursor patronym (sotr_id number)
is
select fc_otch from tsotr
where tsotr.fk_id=sotr_id;
fio varchar2(90);
fam varchar2(30);
im varchar2(30);
otch varchar2(30);
BEGIN
open surname (sotr_id);
fetch surname into fam;
close surname;
open name (sotr_id);
fetch name into im;
close name;
open patronym (sotr_id);
fetch patronym into otch;
close patronym;
fio:=fam||' '||im||' '||otch;
return fio;
END;
P.S. Почему латинских?
P.P.S. 32 символа, имя не влезло.
альтернативы:
nvarchar2(30) - строго юникодная строка
или varchar2(30 char) - 30 символов в установленной кодировке БД (обычно никто не играет с огнем и ставит utf)
селф-фикс: регулируется параметром NLS_LENGTH_SEMANTICS, который по умолчанию byte
Кстати, а почему он varchar2? Первая версия варчара оказалась неудачной?
к слову, varchar давно синоним для varchar2, но все как-то не осмеливаются перейти на человеческое название
и сам оракл почему-то не советует
The VARCHAR datatype is synonymous with the VARCHAR2 datatype. To avoid possible changes in behavior, always use the VARCHAR2 datatype to store variable-length character strings.
Зато в мускуле по-умолчанию только latin1_swedish_ci, только хардкор... Наверное каждый, кто юзал мускуль, на эту хрень хоть раз налетал, замечая, что "как-то оно не так сортирует русские буквы", а потом матерился и перезаливал базу...
очевидно, чукча не знал, как из одного курсора сразу в три переменных зафетчить, что можно склеить строки прямо в селекте
да и смысл в хранимой процедуре тут, она ничего особенного не делает - только лишний раз контекст переключать
что-то типа этого решило бы все его проблемы с производительностью