Oracle - nls oracle, nls lang oracle, nls опции, nls избор на сървърни опции, nls sql, nls

Нашият експерт определя операционната система, "ускорява" работата на приложенията, обяснява характеристиките на работата с NLS параметри и изписване на номера.

Въпрос.Видях някой да показва на вашия сайт как да определи операционната система, на която работи помощната програма SQL*Plus; сега обаче не мога да намеря тази информация. Имам SQL скрипт, който използвам за създаване на други SQL скриптове. Искам да разширя този скрипт, така че когато бъде извикан на UNIX платформа, изпълняваща SQL*Plus, той ще създаде както SQL скрипт,, така искрипт на обвивка.

Отговор.Мисля, че видяхте на сайта Ask Tom как да определите операционната система, на която работи сървърът на базата данни. Това може да се направи с помощта на функцията DBMS_UTILITY.PORT_STRING:

Това ви казва не на каква операционна система работи вашият SQL*Plus клиент, а на каква операционна система работи самият сървър на базата данни (те могат да се различават). Въпреки това двете колони на изгледа V$SESSION, PROGRAM и PROCESS, могат да помогнат. Колоната PROGRAM обикновено показва името на клиентската програма, която е свързана към сървъра на базата данни (но това име може лесно да бъде подвеждащо, ако файловете са копирани с различни имена), а колоната PROCESS показва идентификатора на процеса на клиента, свързан към сървъра на базата данни - идентификатора на процеса от самата клиентска машина. И двете колони ще ви помогнат да разберете името на клиентската операционна система, на която работи SQL*Plus. Нека изпълним следната заявка:

В този случай това е клиентът на Windows SQL*Plus, както се вижда от наличието на „.exe“ в името на програмата идвоеточие (:) в ID на процеса. Ако обаче използвам UNIX клиент, за да се свържа със същия сървър на база данни, ще видя нещо подобно на това:

Името на програмата няма разширение „.exe“, тъй като не се използва в UNIX среда, а идентификационният номер на процеса на клиента няма двоеточие, както имаше клиентът на Windows.

Вижтеasktom.oracle.com/за първоначална интерактивна дискусия и развитие на тази тема.

tkyte/DetermineOS.html. Благодаря на всички интерактивни участници за добрите идеи.

Ускоряване на приложенията

Въпрос.Имаме приложение, което създава потребители и определя частни псевдоними за тях. Понякога администраторът по сигурността извършва множество изтривания на потребители, които вече не се нуждаят от достъп до базата данни. Може да отнеме около две минути, за да изтриете потребител, който има около хиляда лични псевдоними. Недоволна съм от толкова бавното изтриване на остарели акаунти. Имате ли някакви предложения за подобряване на производителността на оператора DROP USER, освен превключване на системата да използва публични синоними?

Отговор.Всичко е въпрос на възприятие.Всеки път, когато имам дълъг работещ процес, мисля как да го стартирам във фонов режим, така че „нещастният“ краен потребител никога да не чака да завърши. Ако крайният потребител не трябва да чака процеса да завърши, той ще изглежда, че е работил моментално.

Така че нека стартираме дълготраен процес във фонов режим и крайният потребител ще си помисли: „Готино, наистина работи бързо“! Препоръчвам да изпълните оператора DROP USER username CASCADE по този начин:

Потребителят веднага получава съобщение, че всичко е наред. Заключването на акаунт предотвратява достъпа му до базата данни и действителното изтриване на схемата на потребителя (което може да отнеме известно време) ще започне във фонов режим малко след издаване на оператора COMMIT (крайният потребител не трябва да чака изтриването да завърши).

Използвам този метод винаги, когато се появят уж дълго изпълнявани задачи - скриване на истинската работа благодарение на фона и незабавно продължаване на работата на крайните потребители, така че те смятат, че приложението работи много по-бързо, отколкото е в действителност.

Параметърът NLS_DATE_FORMAT не работи

Въпрос.Защо настройката NLS_DATE_FORMAT (формат на датата) в моя файл init.ora понякога не работи? Инсталирах го, но в моите приложения форматът на датата по подразбиране не е зададен правилно.

Отговор.Акокоято и да еопция за NLS е зададена в клиентската среда, те винаги отменят опциите за NLS от страната на сървъра. Например, ако клиентът зададе опцията NLS_LANG, всички NLS опции от страната на сървъра ще бъдат игнорирани. Сървърът ще използва стойностите, зададени от клиента, и стойностите по подразбиране за всички други NLS параметри, като игнорира настройките във файла init.ora.

Това обикновено се случва на Windows клиенти. Когато са инсталирани такива клиенти, параметърът NLS_LANG е зададен по подразбиране в системния регистър. Можете да разрешите проблема си по един от следните начини:

  • задайте параметъра NLS_DATE_FORMAT в системния регистър на клиента;
  • вмъкнете оператор ALTER SESSION SET nls_date_format=your_formatвъв вашето приложение, който се изпълнява веднага след свързване със сървъра;
  • използвайте тригер AFTER LOGON, подобен напоказано по-долу.

Лично аз предпочитам втория начин. Ако вашето приложениезависиот конкретен формат на датата по подразбиране, тогава той трябва да бъде поискан изрично. Причина: Ако инсталирате две приложения с конфликтни формати за дата в една и съща система от бази данни, няма да можете да ги използвате, без изрично да зададете форматите за дата. Най-добре е приложенията да не зависят от конкретни настройки на формата по подразбиране във файла init.ora.

Изписване на числа

Въпрос.Опитвам се да изписвам числа. Тоест, искам числото123да се отпечата катосто двадесет и три. Има ли подходящи функции за това?

Отговор.Вярвате или не, почти всичко е там. Съществува формат за дата „Jsp“, който ви позволява да изписвате Юлианското представяне на дата:

Това работи и за числа в Юлианския период от време, в противен случай ще получите грешка:

С малко креативност мога да разширя този диапазон (ако 5,373,484 не е достатъчно голям). Функцията PL/SQL в листинг 1 показва как можете да направите същото. Предлагам ви да прочетете интерактивната дискусия по тази тема наasktom.oracle.com/

tkyte/SpellNumber.html, където можете да видите неговото развитие, включително приноса на сътрудниците за изписване на числа на други езици.

Отчитане на свободно място в базата данни

Въпрос.Имам нужда от SQL*Plus за отпечатване на отчети, които показват свободно място за всяко таблично пространство. Имате ли работеща заявка, която може да направи това?

Отговор.Трябваше да го направя. По принцип трябва да напиша заявка, която показва свободното пространствоза всяко таблично пространство (групиране на изгледа DBA_FREE_SPACE на ниво таблично пространство) и го присъединете със заявка, която показва разпределеното пространство във всяко таблично пространство (включително временни таблични пространства).

Проблемът е, че изгледът DBA_FREE_SPACE показва свободно пространство на ниво екстент, докато изгледите DBA_DATA_FILES и DBA_TEMP_FILES показват разпределеното пространство във файловете с данни на табличното пространство. Преди да обединя тези изгледи, трябва да групирам техните данни на ниво таблично пространство. Вложените изгледи работят добре за това, така че ще ги използвам в заявката, показана в листинг 2. Освен това, за да приспособя заявката за таблични пространства, които са напълно пълни (няма записи в изгледа DBA_FREE_SPACE), така че ще използвам външно съединение, за да получа пълния отговор.

Тази заявка ви позволява да получите:

  • Име на табличното пространство. Името на табличното пространство. Главната звездичка (*) в това име показва, че пространството за таблици се управлява локално, а водещото пространство показва, че това е старомодно пространство за таблици, управлявано от речник. Ако вторият знак от името еa, това означава, че технологията за автоматично управление на сегментно пространство (ASSM) се използва за управление на табличното пространство, а ако вторият знак от името еM, това означава, че табличното пространство се управлява ръчно (опциите pctused, freelists и т.н. се използват за управление на използването на пространството).
  • Kbytes. Разпределеното пространство в табличното пространство; сбор от килобайти, използвани от всички файлове с данни,които са в него.
  • Използвано. Пространството в табличното пространство, което се използва от някои сегменти.
  • Свободно. Свободно пространство в таблично пространство, което не е разпределено от никакви сегменти.
  • % Използвано. Съотношение на свободно пространство към разпределено пространство.
  • Най-голям. Размерът на най-големия непрекъснат набор от налични блокове (най-вече полезен за таблични пространства, управлявани от речник). Ако това число за това таблично пространство е по-малко от следващия разпределен екстент на някакъв обект, той ще се провали със съобщение "свършило място", дори ако колоната FREE показва, че има много свободно пространство.
  • MaxPoss Kbytes. Максимален размер на файла с данни, когато той се разширява автоматично (клауза AUTOEXTEND). (Забележка: този размерможеда е по-малък от определения размер!)
  • % Макс. използван. Колко пространство вече е използвано (като процент от максималния размер).

Преобразуване на представяне на числа в други бройни системи1Въпрос.Как мога да конвертирам числа в друга бройна система (да речем основа 2 или основа 16) и обратно?

Отговор.Отговорът има две части. Започвайки с Oracle8i, функциите TO_CHAR и TO_NUMBER могат да преобразуват основа 10 (десетична) в основа 16 (шестнадесетична) и обратно:

Ако имате нужда от други бройни системи, като осмична (база 8) или двоична (база 2), можете да го направите много лесно с помощта на PL/SQL; всъщност аз също ще конвертирам числа с основа 16. Първо ще напиша функция, която преобразуваположителни десетични числа към числа с всяка друга основа - до основа 36 (разширение на алгоритъма, използван за представяне на числа в различни бройни системи, до шестнадесетичната бройна система). Вижте списък 3.

Сега имам нужда от подходяща функция за обратно преобразуване на числа с произволна база в десетични числа. Показано е в списък 4.

За удобство използвам малката функция, показана в списък 5 за най-често срещаните трансформации.

Въпрос.В среда на Microsoft Windows Server 2003 трябва да попреча на потребителите, които имат ролята oradba, да се свързват без парола към моя сървър на база данни. Когато се свържа като администратор (член на групата oradba), мога да използвам AS SYSDBA, за да се свържа със сървъра с всяка парола, дори празна.

Отговор.Всъщност, технически погледнато, вие сте използвали парола. Влизате в операционната система, като въведете парола.

Привилегията SYSDBA е изключително мощна привилегия. Когато се свържете с AS SYSDBA, тогава се използва удостоверяване на ниво операционна система; не се изисква удостоверяване на ниво база данни. Всъщност е необходимо да се свържете, когато екземплярът на сървъра на базата данни все още не работи. Трябва да ограничите възможностите на акаунтите, които са в тази група. Премахнете от него потребители, които не трябва да имат толкова големи възможности.