dil: (Default)
Tuesday, February 21st, 2012 08:36 am

Дали мне тут задачку простенькую: раз в N минут посмотреть в базу, и если там нашлись подходящие записи, вынуть из них пару полей и отослать по почте соответствующим людям. Ничего сложного. Казалось бы.

Набросал за пять минут скриптик, отослал себе письмо тестовое… Опс. Вместо символов валюты фигня какая-то. Вместо евро вопросики, вместо фунтов британских — решёточки. Ну, думаю, чего-то с кодировками в почте напутал. Включил в скрипте отладочную печать, ан нет, оказывается это оно прямо из базы такое приходит.

Иду к DBA, они запускают в своём TOAD’е тот же запрос, и.. у них всё нормально. Евро как евро, фунты как фунты. “А выставь у себя в скрипте явно NLS_CHARACTERSET”, — говорят они, и у тебя тоже будет всё нормально. “А какой?” — спрашиваю я. “А.. фиг его знает. Мы никогда не пробовали его менять, у нас и так всё работает.”

Ну ладно, пошёл, поставил UTF8. Там вроде ж все символы есть, должно работать.. Авотфиг. Евро появлись, а фунты почему-то показываются однобайтовым символом 0xA3. А должен быть U+C2A3.

Пошел гуглить. Нашёл, что в оракле кодировки называются не по-человечески, а чёрт знает как. Правильное название для UTF8 — AL32UTF8. Попробовал. Те же гениталии.

Ну ладно, не выходит с универсальной кодировкой, попробуем что-нибудь однобайтовое, где оба символа есть. ISO-8859-15. По-оракловому это WE8ISO8859P15. Э-э.. фиг: “connect failed: ERROR OCIEnvNlsCreate. Check ORACLE_HOME (Linux) env var or PATH (Windows) and or NLS settings, permissions, etc.” Не знает оно такой кодировки.

Пробую ISO-8859-1, в которой вообще-то евро нет, но вдруг.. С фунтом нормально, он 0xA3, а вместо евро выдают 0xBF, который ¿.

Испробовал ещё одну разновидность ISO-8859-1 под названием WE8ISOICLUK, UTF16 в лице AL16UTF16 и ещё какую-то UTFE. Нэту таких. “connect failed: ERROR OCIEnvNlsCreate …”

Чтоб этим индусам всю их поганую жизнь икалось.

После трёхчасовых проклятий в их адрес я таки подобрал одну кодировку, в которой видно и то, и другое. Поиск ответа оставляется интересующимся читателям в качестве домашнего задания.

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.

dil: (Default)
Thursday, October 2nd, 2008 11:17 am
Я раньше думал, что Оракл умный. И сам умеет оптимизировать выполнение запросов. А тут наткнулся на ситуацию, когда простейший
SELECT count(*) FROM однатаблица WHERE поле = 'foo' AND дата_добавления >= SYSDATE-30/1440
выполнялся по 15 минут, пока в запрос явным образом не добавили /*+ INDEX_JOIN(BAZ) */

Что я делаю неправильно?
Tags:
dil: (Default)
Friday, December 9th, 2005 12:11 pm
Потратив час с tcpdump'ом и sqlplus'ом в руках, я выяснил, что

SQL> select count(*) from "user"."TABLE";

ERROR at line 1:
ORA-00942: table or view does not exist

тогда как

SQL> select count(*) from user."TABLE";

COUNT(*)
----------
1
и

SQL> select count(*) from "USER"."TABLE";
тоже
COUNT(*)
----------
1

Разницу прочувствовали, да?
dil: (Default)
Tuesday, November 22nd, 2005 06:43 pm
А на четвертый второй день изнурительного труда по расколупыванию ораклового дампа индеец Зоркий Глаз обнаружил, что TOAD вполне себе умеет показывать структуру таблиц, триггеров, функций и процедур в виде SQL-скриптов..
Tags:
dil: (Default)
Tuesday, November 15th, 2005 03:21 pm
У меня очередной странный вопрос - а можно ли из Оракла экспортировать схему в виде SQL-скрипта, а не бинарного файла, как это делает exp?
И если да, то как?
Tags:
dil: (Default)
Tuesday, November 8th, 2005 06:11 pm
У sequence нельзя сбросить START WITH. Зато можно удалить sequence совсем и создать заново.
Но при удалении отваливаются триггеры, которые использовали этот sequence.
Поэтому после создания sequence надо не забыть перекомпилировать триггер.
Вот такая загогулина, панимаишь..
Tags:
dil: (Default)
Sunday, November 6th, 2005 07:17 pm
Вот к этому.
Патч нумер 3006854 от Оракла, который, естественно, дают только зарегистрированным пользователям металинка, делает следующее:технические подробности )

Огромное спасибо [livejournal.com profile] lhovitch за моральную и техническую поддержку :)
Tags:
dil: (Default)
Friday, November 4th, 2005 06:17 pm
Пытался поставить 9i на debian testing. Получил:
Error occurred during initialization of VM
Unable to load native library: /tmp/OraInstall2005-11-04_05-49-12PM/jre/lib/i386/libjava.so: symbol __libc_wait, version GLIBC_2.0 not defined in file libc.so.6 with link time reference

Погуглил.
Because it's an undocumented export of glibc 2.2 that should never have
been used by applications, and is no longer present in glibc 2.3. Sun
stupidly used it in JDK 1.4.0 (and perhaps earlier versions?), which
therefore doesn't work with glibc 2.3. This is fixed in JDK 1.4.1.

На машине установлен JDK 1.4.2, но я так понимаю, инсталлятор пользуется своей устаревшей версией.
Что делать?
Даунгрейдить libc не предлагать.

Может, можно как-то заставить инсталлятор использовать другую java-машину?
Tags:
dil: (Default)
Thursday, October 13th, 2005 12:21 pm
Ну вылитый паскаль.

Кроме того много думал о менталитете авторов Оракла. Он у них получился весь такой логичный-логичный. Но в некоторых местах всё-таки очень ненатуральный..

Вот, например, там нет автоинкрементируемых полей. Вместо них есть sequence, из которых при необходимости можно извлечь очередное значение и засунуть его в нужное поле. При добавлении записи это можно сделать автоматически, например, триггером.
Но вот как клиент может узнать, какое именно значение попало в свежедобавленную запись? Посмотреть в sequence можно, но если в это время кто-нибудь еще вставлял запись в ту же таблицу, то sequence мог уже поменяться.
[livejournal.com profile] cybernatic_cat предложил весь процесс вставки завернуть в хранимую функцию, которая будет сама извлекать очередное значение из sequence, и потом его возвращать.
Да, это будет надёжно работать, но.. как-то оно совсем ненатурально по сравнению с простым и логичным MySQLным SELECT LAST_INSERT_ID() или MSSQLным SELECT @@IDENTITY.

Или я просто не умею правильно готовить этих кошек?
dil: (Default)
Friday, October 7th, 2005 04:26 pm
У wget есть очень полезная опция --load-cookies.
Очень помогает при закачке документации с Оракла, а то они ее там только залогиненным юзерам отдают :)
Tags:
dil: (Default)
Thursday, October 6th, 2005 06:35 pm
А из какого ключа реестра тупой TNSListener от 9i под ублюдочной виндой берет значение ORACLE_HOME?
Ответ HKLM\Software\Oracle\ORACLE_HOME - заведомо неправильный.
остальные подробности )
Tags:
dil: (Default)
Wednesday, October 5th, 2005 05:37 pm
А в этом оракле можно сделать триггер на UPDATE записи, который бы изменял поле в этой же самой записи?
Нормальным способом вложенный UPDATE из триггера не работает, получается deadlock. Autonomous transaction не помогает.

Это вообще возможно? Если да, то как? Если нет, то как это обойти?
В MSSQL оно замечательно работало.

Upd: уточненная задача выглядит так: в таблице есть вычисляемое поле, значение которого зависит от других полей _этой же записи_. Хочется возложить задачу вычисления этого поля на сервер путем триггера, срабатывающего на UPDATE. Так бывает?
Tags:
dil: (Default)
Tuesday, October 4th, 2005 03:15 pm
Знаете, во что перевёл оракловый migration workbench вот эту фразу на T-SQL
DELETE FROM LevelMembers WHERE LevelID = @LevelID
?

Правильно, вот в эту:
DELETE FROM LevelMembers WHERE LevelID = LevelID

И она даже успешно скомпилировалась. Хорошо, что я пошел на нее глазами посмотреть, прежде чем запускать..
Tags:
dil: (Default)
Friday, September 30th, 2005 11:49 am
Под катом приводится кусочек [не работающего из-за перекрытия имён] кода на оракловом PL/SQL, автоматически сгенерированного оракловым же Migration workbench'ем из микрософтовского T-SQL.
Задача: попробуйте осознать, что за фигня здесь написана, и восстановить исходный код :).
код )
dil: (Default)
Wednesday, September 28th, 2005 04:33 pm
Oracle Enterprise Manager 10g Grid Control Release 1 (10.1.0.3)
for Microsoft Windows
Download the complete files
windows_10.1.0.3_EM_GC.zip (1,047,933,060 bytes)

Для тех, у кого с арифметикой тяжело, поясняю: это почти гигабайт. В зипе.
Что они туда положили, а?
Tags:
dil: (Default)
Friday, June 10th, 2005 02:44 pm
Debian is not officially supported by Oracle. Be smart, lie :

# echo "Red Hat Enterprise Linux ES release 2.1 (Panama)" > /etc/redhat-release

выкопал [livejournal.com profile] dma, а мне рассказал [livejournal.com profile] bobuk