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

Откуда:
Сообщений: 22
Прошу совета ,не могу получить русский текст из функции в postgresql через dg4odbc

Имеем :
initosm.ora

HS_FDS_CONNECT_INFO = OSM
HS_FDS_TRACE_LEVEL = Debug
HS_LANGUAGE = AMERICAN_AMERICA.CL8MSWIN1251
set PGCLIENTENCODING=WIN1251



listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\oracle\product\11.2.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\oracle\product\11.2.0\dbhome_1\bin\oraclr11.dll")
     )
     (SID_DESC =
      (SID_NAME=OSM)
      (ORACLE_HOME=C:\oracle\product\11.2.0\dbhome_1)        
      (PROGRAM=dg4odbc)
	 )
................
   )

ADR_BASE_LISTENER_HS= C:\oracle\product\11.2.0\dbhome_1\dg4odbc

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = C:\oracle



tnsnames.ora

OSM =(DESCRIPTION=
   (ADDRESS=
     (PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)
	)
     (CONNECT_DATA=(SID=osm))
        (HS=OK)
)


далее в oracle создан dblink:
CREATE DATABASE LINK "OSM"
  CONNECT TO "OSM" IDENTIFIED BY VALUES '.............' USING 'OSM';


в postgresql :
CREATE DATABASE osm
  WITH OWNER = osm
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'Russian_Russia.1251'
       LC_CTYPE = 'Russian_Russia.1251'
       CONNECTION LIMIT = -1;


set client_encoding=WIN1251


и вот такая тестовая ф-я с выводом в т.ч. русской буквы "ф":

CREATE OR REPLACE FUNCTION testgetaddr(lat character varying, longit character varying)
  RETURNS character varying AS
$BODY$
DECLARE addr varchar(256);
begin
addr:='123ф'; 
return addr;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;


в oracle
AMERICAN_AMERICA.CL8MSWIN1251


set serveroutput on



DECLARE
    l_ret integer;
    c integer;
    val  VARCHAR2(4000);
    val_bool  boolean;
    nr   INTEGER;
    BEGIN
      nr := DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE@osm ('set client_encoding=WIN1251');
      c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@osm4;
      DBMS_HS_PASSTHROUGH.PARSE@osm (c,'select testgetaddr(?,?);');
      DBMS_HS_PASSTHROUGH.Bind_Variable@osm(c,1,'30.260125');  
      DBMS_HS_PASSTHROUGH.Bind_Variable@osm(c,2,'59.880177');
      l_ret:=DBMS_HS_PASSTHROUGH.execute_non_query@osm(c);
      l_ret:= DBMS_HS_PASSTHROUGH.FETCH_ROW@osm(c);
      DBMS_OUTPUT.PUT_LINE('val=1'||val);
      DBMS_HS_PASSTHROUGH.GET_VALUE@osm4(c, 1, val);
       DBMS_OUTPUT.PUT_LINE('val=2'||val);
     DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@osm4(c);
     DBMS_OUTPUT.PUT_LINE('val='||val);
     commit;
   END;
   /



Вроде уже пробовал везде и UTF8 повписывать и чё то всё никак.
28 июн 12, 15:46    [12789473]     Ответить | Цитировать Сообщить модератору
 Re: dg4odbc postgresql и русский язык  [new]
rdvvdr
Member

Откуда:
Сообщений: 22
rdvvdr,

на самом деле проблема вылезает и следующим образом:
При вызове функции ,которая получает данные из таблицы и возвращает некий текст с русскими буквами,происходит вот такое исключение

ORA-02055: сбой распределенной операции обновления; требуется откат
ORA-28500: соединение ORACLE с посторонней системой выдало сообщение:
ОШИБКА: Invalid OGC WKT (too short);
No query has been executed with that handle {XX000,NativeErr = 1}


PS в посте выше есть мелкие опечатки по имени dblink ,но суть от этого не меняется
28 июн 12, 15:55    [12789543]     Ответить | Цитировать Сообщить модератору
 Re: dg4odbc postgresql и русский язык  [new]
rdvvdr
Member

Откуда:
Сообщений: 22
Vожет кому пригодится:

Проблема оказалось в том,что надо было выбирать драйвер "PostgreSQL ANSI" (а не Postgres UNICODE)
4 июл 12, 11:43    [12814740]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить