Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Проблема с русским шрифтом в процедуре PL/SQL  [new]
Paradox_85
Member

Откуда:
Сообщений: 6
Уважаемые форумчане, столкнулся недавно с такой проблемой при передаче в качестве входного параметра в процедуру, переменной типа VARCHAR2(200) русский шрифт не распознается. Работаю в TOAD 9.6, в реестре все прописал как положено NLS_LANG = RUSSIAN_CIS.CL8MSWIN1251, в [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Nls\CodePage] "1252"="c_1251.nls". Тело процедуры ниже:
CREATE OR REPLACE procedure SAPRHELP.SELECT_VALVES(
PRESS SPEC_NAMES.SPEC_PMIN%TYPE, TEMP SPEC_NAMES.SPEC_TMIN%TYPE,
PRJ_NAME PROJECT.PRJ_NAME%TYPE, VENDOR COMP_PROP.VENDOR%TYPE,
NOM_DIAM SCOM.P1_D%TYPE, G_TYPE SCOM.GTYPE%TYPE) IS

cursor select_class is
SELECT DISTINCT SPEC_NAMES.SPEC_NAME
FROM SPEC_NAMES, PROJECT_SPEC
WHERE (SPEC_NAMES.SPEC_CODE = PROJECT_SPEC.SPEC_CODE(+))
AND (TEMP BETWEEN (SPEC_TMIN)AND(SPEC_TMAX))
AND (PROJECT_SPEC.PRJ_ID = PRJ_ENCODE(PRJ_NAME))
AND (PRESS BETWEEN (SPEC_PMIN)AND(SPEC_PMAX));

cursor select_valves (SPA_NAME spec_names.SPEC_NAME%type) is
SELECT SCOM.TYPE, SCOM.SUBTYPE1, SCOM.SUBTYPE2,
SCOM.STANDART, SMTE.XTEXT, SCOM.P1_D, SPEC_NAMES.SPEC_NAME,
COMP_PROP.VENDOR
FROM SPEC_DATA, SPEC_NAMES, PROJECT_SPEC, SCOM, COMP_PROP, SMTE
WHERE (SPEC_NAMES.SPEC_CODE = PROJECT_SPEC.SPEC_CODE(+)) and
(SPEC_NAMES.SPEC_CODE = SPEC_DATA.SPEC_NAME_CODE) and
(PROJECT_SPEC.PRJ_ID = prj_encode(prj_name)) and
(SPEC_DATA.SCOM_NAME_ID = SCOM.SCOM_NAME_ID(+)) and
(SPEC_DATA.SCOM_NAME_ID = COMP_PROP.SCOM_NAME_ID(+)) and
(SPEC_DATA.MATXT = SMTE.SMTE(+)) and
--вот этот самый VENDOR и не воспринимается, он представляет собой строку типа 'КТЗ'
--если прописать напрямую COMP_PROP.VENDOR = 'КТЗ', то все работает
(COMP_PROP.VENDOR = VENDOR) and
(SPEC_NAMES.SPEC_NAME = SPA_NAME) and
(SCOM.P1_D = NOM_DIAM) and
(SCOM.GTYPE = G_TYPE) and
(not SCOM.STANDART is null) and
(not SMTE.XTEXT is null)
ORDER BY COMP_PROP.VENDOR;
BEGIN
DELETE FROM CHOICE_VALVES;
for Class_Data in select_class loop

for Valve_Data in select_valves (Class_Data.SPEC_NAME) loop
insert into CHOICE_VALVES
values (Valve_Data.TYPE, Valve_Data.SUBTYPE1, Valve_Data.SUBTYPE2,
Valve_Data.STANDART, Valve_Data.XTEXT, Valve_Data.P1_D,
Valve_Data.SPEC_NAME, Valve_Data.VENDOR);
end loop;

end loop;
COMMIT;
end SELECT_VALVES;
/
Пробовал и в PL/SQL Developer и из VB 6 - то же самое, может кто нибудь сталкивался с такой проблемой?
15 сен 08, 16:53    [6186748]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с русским шрифтом в процедуре PL/SQL  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Paradox_85
Уважаемые форумчане, столкнулся недавно с такой проблемой при передаче в качестве входного параметра в процедуру, переменной типа VARCHAR2(200) русский шрифт не распознается. Работаю в TOAD 9.6, в реестре все прописал как положено NLS_LANG = RUSSIAN_CIS.CL8MSWIN1251, в [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Nls\CodePage] "1252"="c_1251.nls". Тело процедуры ниже:
CREATE OR REPLACE procedure SAPRHELP.SELECT_VALVES(
  PRESS SPEC_NAMES.SPEC_PMIN%TYPE, TEMP SPEC_NAMES.SPEC_TMIN%TYPE,
  PRJ_NAME PROJECT.PRJ_NAME%TYPE, VENDOR COMP_PROP.VENDOR%TYPE,
  NOM_DIAM SCOM.P1_D%TYPE, G_TYPE SCOM.GTYPE%TYPE) IS
  
   cursor select_class is
      SELECT DISTINCT SPEC_NAMES.SPEC_NAME 
      FROM SPEC_NAMES, PROJECT_SPEC
      WHERE (SPEC_NAMES.SPEC_CODE = PROJECT_SPEC.SPEC_CODE(+))
            AND (TEMP BETWEEN (SPEC_TMIN)AND(SPEC_TMAX))
            AND (PROJECT_SPEC.PRJ_ID = PRJ_ENCODE(PRJ_NAME))
            AND (PRESS BETWEEN (SPEC_PMIN)AND(SPEC_PMAX)); 
            
    cursor select_valves (SPA_NAME spec_names.SPEC_NAME%type) is 
         SELECT SCOM.TYPE, SCOM.SUBTYPE1, SCOM.SUBTYPE2, 
                    SCOM.STANDART, SMTE.XTEXT, SCOM.P1_D, SPEC_NAMES.SPEC_NAME,
                    COMP_PROP.VENDOR
         FROM SPEC_DATA, SPEC_NAMES, PROJECT_SPEC, SCOM, COMP_PROP, SMTE
         WHERE (SPEC_NAMES.SPEC_CODE = PROJECT_SPEC.SPEC_CODE(+)) and
               (SPEC_NAMES.SPEC_CODE = SPEC_DATA.SPEC_NAME_CODE)  and
               (PROJECT_SPEC.PRJ_ID = prj_encode(prj_name)) and
               (SPEC_DATA.SCOM_NAME_ID = SCOM.SCOM_NAME_ID(+)) and
               (SPEC_DATA.SCOM_NAME_ID = COMP_PROP.SCOM_NAME_ID(+)) and
               (SPEC_DATA.MATXT = SMTE.SMTE(+)) and
               --вот этот самый VENDOR и не воспринимается, он представляет собой строку типа 'КТЗ'
               --если прописать напрямую COMP_PROP.VENDOR = 'КТЗ', то все работает
               (COMP_PROP.VENDOR = VENDOR)  and
	       (SPEC_NAMES.SPEC_NAME = SPA_NAME) and
	       (SCOM.P1_D = NOM_DIAM) and
	       (SCOM.GTYPE = G_TYPE) and
	       (not SCOM.STANDART is null) and
	       (not SMTE.XTEXT is null)
	       ORDER BY COMP_PROP.VENDOR;
BEGIN
  DELETE FROM CHOICE_VALVES;
  for Class_Data in select_class loop

     for Valve_Data in select_valves (Class_Data.SPEC_NAME) loop
	 	 insert into CHOICE_VALVES
		 	  values (Valve_Data.TYPE, Valve_Data.SUBTYPE1, Valve_Data.SUBTYPE2,
			          Valve_Data.STANDART, Valve_Data.XTEXT, Valve_Data.P1_D, 
					  Valve_Data.SPEC_NAME, Valve_Data.VENDOR);	    
     end loop;
  
  end loop;
  COMMIT;
end SELECT_VALVES;
/
Пробовал и в PL/SQL Developer и из VB 6 - то же самое, может кто нибудь сталкивался с такой проблемой?

При оформлении кода используйте, пожалуйста, тег SRC данного форума.
Этим вы повысите свои шансы на получение ответа.
15 сен 08, 17:00    [6186797]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с русским шрифтом в процедуре PL/SQL  [new]
BeautifulGirl
Member

Откуда:
Сообщений: 42
А если попробовать кодировку nls_lang=russian_cis.ru8pc866 ?
15 сен 08, 17:05    [6186828]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с русским шрифтом в процедуре PL/SQL  [new]
BeautifulGirl
Member

Откуда:
Сообщений: 42
Сейчас себе ее поставила, посмотрим, что получится :)
15 сен 08, 17:07    [6186841]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с русским шрифтом в процедуре PL/SQL  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Paradox_85

CREATE OR REPLACE procedure SAPRHELP.SELECT_VALVES(
  ... , VENDOR COMP_PROP.VENDOR%TYPE, ...) IS
...  
    cursor select_valves (SPA_NAME spec_names.SPEC_NAME%type) is 
...
               (COMP_PROP.VENDOR = VENDOR)  and
...
end SELECT_VALVES;
/

Это эквивалентно
CREATE OR REPLACE procedure SAPRHELP.SELECT_VALVES(
  ... , VENDOR COMP_PROP.VENDOR%TYPE, ...) IS
...  
    cursor select_valves (SPA_NAME spec_names.SPEC_NAME%type) is 
...
               (COMP_PROP.VENDOR = COMP_PROP.VENDOR)  and
...
end SELECT_VALVES;
/
Если в других таблицах запроса нет полей с именем VENDOR

Вы же, видимо, хотели выразить такую "мысль":
CREATE OR REPLACE procedure SAPRHELP.SELECT_VALVES(
  ... , VENDOR COMP_PROP.VENDOR%TYPE, ...) IS
...  
    cursor select_valves (SPA_NAME spec_names.SPEC_NAME%type) is 
...
               (COMP_PROP.VENDOR = SAPRHELP.SELECT_VALVES)  and
...
end SELECT_VALVES;
/
Это типичная ошибка. Почитайте про names resolution

P.S. Рекомендую в SQL всегда использовать квалифицированные имена переменных PL/SQL
15 сен 08, 17:07    [6186845]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с русским шрифтом в процедуре PL/SQL  [new]
BeautifulGirl
Member

Откуда:
Сообщений: 42
SQL*Plus
Paradox_85

CREATE OR REPLACE procedure SAPRHELP.SELECT_VALVES(
  ... , VENDOR COMP_PROP.VENDOR%TYPE, ...) IS
...  
    cursor select_valves (SPA_NAME spec_names.SPEC_NAME%type) is 
...
               (COMP_PROP.VENDOR = VENDOR)  and
...
end SELECT_VALVES;
/

Это эквивалентно
CREATE OR REPLACE procedure SAPRHELP.SELECT_VALVES(
  ... , VENDOR COMP_PROP.VENDOR%TYPE, ...) IS
...  
    cursor select_valves (SPA_NAME spec_names.SPEC_NAME%type) is 
...
               (COMP_PROP.VENDOR = COMP_PROP.VENDOR)  and
...
end SELECT_VALVES;
/
Если в других таблицах запроса нет полей с именем VENDOR

Вы же, видимо, хотели выразить такую "мысль":
CREATE OR REPLACE procedure SAPRHELP.SELECT_VALVES(
  ... , VENDOR COMP_PROP.VENDOR%TYPE, ...) IS
...  
    cursor select_valves (SPA_NAME spec_names.SPEC_NAME%type) is 
...
               (COMP_PROP.VENDOR = SAPRHELP.SELECT_VALVES)  and
...
end SELECT_VALVES;
/
Это типичная ошибка. Почитайте про names resolution

P.S. Рекомендую в SQL всегда использовать квалифицированные имена переменных PL/SQL


Если поле VENDOR есть в 2-х таблицах, то он должен был выругаться, что поле определено не однозначно.
15 сен 08, 17:21    [6186909]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с русским шрифтом в процедуре PL/SQL  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
BeautifulGirl
Если поле VENDOR есть в 2-х таблицах, то он должен был выругаться, что поле определено не однозначно.
Согласен. Значит такое поле есть только в этой таблице.
15 сен 08, 17:46    [6187076]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с русским шрифтом в процедуре PL/SQL  [new]
BeautifulGirl_
Guest
Скорее всего имеется в виду тот VENDOR, который - входной параметр COMP_PROP.VENDOR%TYPE, тока осталось объяснить это компьютеру :))

ЗЫ переменную в VENDOR1 переименуйте
15 сен 08, 19:17    [6187495]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с русским шрифтом в процедуре PL/SQL  [new]
Paradox_85
Member

Откуда:
Сообщений: 6
Спасибо большое за советы, все оказалось очень просто, параметр и поле в одной из таблиц называются одинаково - VENDOR, и в запросе возникла неоднозначность, я просто переименовал параметр в VENDOR_1 и все заработало как надо, еще раз большое спасибо!
16 сен 08, 08:49    [6188460]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить