dil: (Default)
2012-02-21 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)
2008-10-02 11:17 am
Entry tags:

Оракл?

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

Что я делаю неправильно?
dil: (Default)
2005-12-09 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)
2005-11-22 06:43 pm
Entry tags:

Оракловое

А на четвертый второй день изнурительного труда по расколупыванию ораклового дампа индеец Зоркий Глаз обнаружил, что TOAD вполне себе умеет показывать структуру таблиц, триггеров, функций и процедур в виде SQL-скриптов..
dil: (Default)
2005-11-15 03:21 pm
Entry tags:

Товарищи ораклоиды!

У меня очередной странный вопрос - а можно ли из Оракла экспортировать схему в виде SQL-скрипта, а не бинарного файла, как это делает exp?
И если да, то как?
dil: (Default)
2005-11-08 06:11 pm
Entry tags:

Ещё немножко, и я с этим вашим ораклом совсем свихнусь

У sequence нельзя сбросить START WITH. Зато можно удалить sequence совсем и создать заново.
Но при удалении отваливаются триггеры, которые использовали этот sequence.
Поэтому после создания sequence надо не забыть перекомпилировать триггер.
Вот такая загогулина, панимаишь..
dil: (Default)
2005-11-06 07:17 pm
Entry tags:

К вопросу об Оракле 9i под линуксом

Вот к этому.
Патч нумер 3006854 от Оракла, который, естественно, дают только зарегистрированным пользователям металинка, делает следующее:технические подробности )

Огромное спасибо [livejournal.com profile] lhovitch за моральную и техническую поддержку :)
dil: (Default)
2005-11-04 06:17 pm
Entry tags:

Очередной вопрос про оракл. Теперь под линуксом

Пытался поставить 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-машину?
dil: (Default)
2005-10-13 12:21 pm

Учился писать программы на PL/SQL

Ну вылитый паскаль.

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

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

Или я просто не умею правильно готовить этих кошек?
dil: (Default)
2005-10-07 04:26 pm
Entry tags:

Хозяйке на заметку

У wget есть очень полезная опция --load-cookies.
Очень помогает при закачке документации с Оракла, а то они ее там только залогиненным юзерам отдают :)
dil: (Default)
2005-10-06 06:35 pm
Entry tags:

Товарищи ораклисты!

А из какого ключа реестра тупой TNSListener от 9i под ублюдочной виндой берет значение ORACLE_HOME?
Ответ HKLM\Software\Oracle\ORACLE_HOME - заведомо неправильный.
остальные подробности )
dil: (Default)
2005-10-05 05:37 pm
Entry tags:

Товарищи ораклисты!

А в этом оракле можно сделать триггер на UPDATE записи, который бы изменял поле в этой же самой записи?
Нормальным способом вложенный UPDATE из триггера не работает, получается deadlock. Autonomous transaction не помогает.

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

Upd: уточненная задача выглядит так: в таблице есть вычисляемое поле, значение которого зависит от других полей _этой же записи_. Хочется возложить задачу вычисления этого поля на сервер путем триггера, срабатывающего на UPDATE. Так бывает?
dil: (Default)
2005-10-04 03:15 pm
Entry tags:

Об автоматических переводчиках

Знаете, во что перевёл оракловый migration workbench вот эту фразу на T-SQL
DELETE FROM LevelMembers WHERE LevelID = @LevelID
?

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

И она даже успешно скомпилировалась. Хорошо, что я пошел на нее глазами посмотреть, прежде чем запускать..
dil: (Default)
2005-09-30 11:49 am

Знатокам баз данных

Под катом приводится кусочек [не работающего из-за перекрытия имён] кода на оракловом PL/SQL, автоматически сгенерированного оракловым же Migration workbench'ем из микрософтовского T-SQL.
Задача: попробуйте осознать, что за фигня здесь написана, и восстановить исходный код :).
код )
dil: (Default)
2005-09-28 04:33 pm
Entry tags:

Однако..

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)

Для тех, у кого с арифметикой тяжело, поясняю: это почти гигабайт. В зипе.
Что они туда положили, а?
dil: (Default)
2005-06-10 02:44 pm
Entry tags:

Как установить Оракл на Дебиан..

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