2009-08-24 4 views
1

Я пытаюсь извлечь данные из таблицы Oracle. Столбец определяется как char (40) и содержит расширенные значения ASCII. В настоящее время в SQL * Plus расширенные символы отображаются как вопросительный знак «перевернутый». Мне нужно иметь возможность извлекать символы ASCII с десятичным значением> 128 и отображать в расширенной или 8-битной схеме кодирования.
Набор символов Oracle ASCII - .Net-расширения

- Выходной ток

выберите MyField из MYTABLE;

[email protected]¿pmxJ¿¿¿.¿¿¿P9¿¿¿¿¿+¿¿w) ¿@ Y @ B¿¿¿


- Decimal Values ​​

Тип = 96 Len = 40:
98,64,189,112,109,120,74,156,27,231,167,46,224,28,130,183,80,57,202,232,150,239,144,43,169,1,186,119,41,254,64,89,64,12,19,8,66,194,136,210

- База данных CharacterSet

SQL> SELECT * FROM NLS_DATABASE_PARAMETERS;

ПАРАМЕТР ЗНАЧЕНИЕ

------------------------------ ------ ----------------------------------

NLS_CSMIG_SCHEMA_VERSION 5

NLS_LANGUAGE АМЕРИКАНСКОГО

NLS_TERRITORY AMERICA

NLS_CURRENCY $

NLS_ISO_CURRENCY АМЕРИКА

NLS_NUMERIC_CHARACTERS.,

NLS_CHARACTERSET US7ASCII

NLS_CALENDAR GREGORIAN

NLS_DATE_FORMAT DD-MON-RR

NLS_DATE_LANGUAGE AMERICAN

NLS_SORT BINARY


ПАРАМЕТР ЗНАЧЕНИЕ

------------------------------ ------ ----------------------------------

NLS_TIME_FORMAT HH.MI.SSXFF AM

NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM

NLS_TIME_TZ_FORMAT HH.M I.SSXFF AM TZR

NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR

NLS_DUAL_CURRENCY $

NLS_COMP BINARY

NLS_LENGTH_SEMANTICS BYTE

NLS_NCHAR_CONV_EXCP FALSE

NLS_NCHAR_CHARACTERSET UTF8

NLS_RDBMS_VERSION 10.2.0.3.0

не имеют большой опыт работы с Oracle. Любая помощь будет принята с благодарностью!

Спасибо, Бреннан


Я был в состоянии извлечь данные в десятичном формате и обработать его в функции .Net без проблем. Оператор SQL является немного беспорядочным. Я пытаюсь написать функцию для помощи в запросе. У меня возникают проблемы с созданием функции.

текущий SQL оператор:

select DECRYPTDATA(
    ASCII(SUBSTR(ACTIONCD,1,1)) || ',' || 
    ASCII(SUBSTR(ACTIONCD,2,1)) || ',' || 
    ASCII(SUBSTR(ACTIONCD,3,1)) || ',' || 
    ASCII(SUBSTR(ACTIONCD,4,1)) || ',' || 
    ASCII(SUBSTR(ACTIONCD,5,1)) || ',' || 
    ASCII(SUBSTR(ACTIONCD,6,1)) || ',' || 
    ASCII(SUBSTR(ACTIONCD,7,1)) || ',' || 
    ASCII(SUBSTR(ACTIONCD,8,1)) || ',' || 
    ASCII(SUBSTR(ACTIONCD,9,1)) || ',' || 
    ASCII(SUBSTR(ACTIONCD,10,1)) || ',' || 
    ASCII(SUBSTR(ACTIONCD,11,1)) || ',' || 
    ASCII(SUBSTR(ACTIONCD,12,1)) || ',' || 
    ASCII(SUBSTR(ACTIONCD,13,1)) || ',' || 
    ASCII(SUBSTR(ACTIONCD,14,1)) || ',' || 
    ASCII(SUBSTR(ACTIONCD,15,1)) || ',' || 
    ASCII(SUBSTR(ACTIONCD,16,1)), '1' ) 
     from ORDERACTIONS where KEYNUM = 1 

Я хотел бы сделать быструю функцию, чтобы вернуть эту строку.

Ниже приведена функция, которая не будет компилироваться. Какие-либо предложения?

create or replace function ASCIITODEC(p_actioncd VARCHAR2) 
return VARCHAR2 is 
begin 

    return ASCII(SUBSTR(p_actioncd,1,1)) || ',' || 
      ASCII(SUBSTR(p_actioncd,2,1)) || ',' || 
      ASCII(SUBSTR(p_actioncd,3,1)) || ',' || 
      ASCII(SUBSTR(p_actioncd,4,1)) || ',' || 
      ASCII(SUBSTR(p_actioncd,5,1)) || ',' || 
      ASCII(SUBSTR(p_actioncd,6,1)) || ',' || 
      ASCII(SUBSTR(p_actioncd,7,1)) || ',' || 
      ASCII(SUBSTR(p_actioncd,8,1)) || ',' || 
      ASCII(SUBSTR(p_actioncd,9,1)) || ',' || 
      ASCII(SUBSTR(p_actioncd,10,1)) || ',' || 
      ASCII(SUBSTR(p_actioncd,11,1)) || ',' || 
      ASCII(SUBSTR(p_actioncd,12,1)) || ',' || 
      ASCII(SUBSTR(p_actioncd,13,1)) || ',' || 
      ASCII(SUBSTR(p_actioncd,14,1)) || ',' || 
      ASCII(SUBSTR(p_actioncd,15,1)) || ',' || 
      ASCII(SUBSTR(p_actioncd,16,1))) 

end ASCIITODEC; 
/

Спасибо, Бреннан

ответ

0

Там нет ничего плохого, кроме ОНК дополнительного paranthesis в конце.

Можно попробовать эту функцию.

создать или заменить функцию str_ascii (pin in char) return char is ret_val varchar2 (100); ch char (1); начало начало для n в 1 ..length (pin) , если ret_val не равен нулю, тогда ret_val: = ret_val || ','; end if; ch: = substr (pin, n, 1); ret_val: = ret_val || ASCII (ч); контур конца; конец; return ret_val; конец;

Азиз

+0

, в котором был введен правильный отступ b ut отображается здесь в непрерывном формате. Во всяком случае вы можете нажать enter после; сделать читаемым – Aziz

0

У вас есть проблемы. Набор символов базы данных (NLS_CHARACTERSET) - US7ASCII. Это означает, что база данных поддерживает только 7-битные символы ASCII в столбцах CHAR. База данных не поддерживает использование каких-либо символов выше 128 на любой кодовой странице Windows, о которой вы говорите (моя догадка - Windows-1252, но есть много возможностей).

Сколько данных у вас есть в этой базе данных? Используется ли база данных другими приложениями? Правильно ли работают эти приложения?

В идеале вы могли бы воссоздать базу данных с соответствующим набором символов (скорее всего, WE8MSWIN1252 или AL32UTF8), перезагрузить данные, и жизнь будет хорошей. Тем не менее, если у вас есть существующие приложения, которые работают, это указывает на то, что у вас есть приложения, зависящие от обхода кода преобразования набора символов в клиенте Oracle, который открывает целый другой источник боли.

+0

Привет Джастин, Есть миллионы записей в базе данных, и есть первичные системы ERP, взаимодействующие с базой данных. Есть ли способ передать десятичное значение из столбца? Мне нужно только получить доступ к первым 20 позициям. ASCII (SUBSTR (Mycol, 1,1) + '' + SUBSTR (Mycol, 2,1) .... Спасибо, Бреннан –

1

ваш NLS_CHARACTERSET определяется как:

NLS_CHARACTERSET US7ASCII 

Таким образом, оракул гарантирует только то, что стандартные символы ASCII могут быть сохранены Вы должны либо

  • изменение вашего характера базы данных установлен на что-то, что позволяет расширенные символы, например: UTF-8

OR

  • изменить поле от CHAR до NCHAR. Столбцы NCHAR подберут NLS_NCHAR CHARACTERSET, который, как я вижу, установлен в UTF-8.

Кроме того, вы уверены, что хотите использовать CHAR вместо VARCHAR? Поля CHAR дополняются до 24 символов. NVARCHAR - поля длиной до 40 символов.

Все, что было сказано, если вам удалось заполнить символы без ascii в поля US7ASCII, иногда можно преобразовать кодировку базы данных в нечто вроде WE8ISO8859P1. См

http://download.oracle.com/docs/cd/B10501_01/server.920/a96529/ch2.htm#101203

+0

Здравствуйте Chi,
Спасибо за быстрый ответ. Есть способ преобразовать символ «на лету» с помощью функции Oracle. Я не собираюсь быть в состоянии преобразовать базу данных.
спасибо, Brennan –

+0

CONVERT (поле_формы, «WE8ISO8859P1», «US7ASCII») МОЖЕТ РАБОТАТЬ. В конце концов, однако, вы находитесь на неподдерживаемой территории, если вы не изменяете кодировку БД или не переключаетесь на использование кода NCHAR – Chi

Смежные вопросы