Dsvolk > > Oracle > > Faq > > Dvp My Blog | Search | About
(Not Logged In)
[ welcome! ] [ news ] [ install ] [ jump-jet ] [ app ] [ rac ] [ papers ] [ dba ] [ dvp ] [ racdd4d ] [ oem ] [ statspack ] [ education ] [ tuning ] [ ias ] [ backup ] [ dataprotection ] [ security ] [ oid ] [ options ] [ integration ] [ sales ] [ sun ] [ linux ] [ consulting ] [ faq ]

ЧАВО

Соглашение о материалах на этом сайте

Мой oracle blog
true dsvolk!
ЧАсто задаваемые ВОпросы  

Development

 

 

Links:

www.ixora.com.au

tahiti.oracle.com

asktom.oracle.com

metalink.oracle.com

otn.oracle.com

hotsos.com

jlcomp.demon.co.uk

www.orafaq.net

oraperf.sourceforge.net


Q: Как произвести тюниг  ?

A: Тюнинг приложения расписан здесь. Есть и пример того, как обрабатывать полученную статистику.

Q: Как сделать возможным получение плана выполнения запроса в sqlplus  ?

A: Для этого необходимо создать таблицу plan_table и дать пользователю привелегию plustrace. Детали расписаны здесь

Q: Как достать записи с номерами с n до m  ?

A: Это обычная задача. когда нужно организовать постраничный вывод информации. Здесь оригинальный ответ. Далее мои комментарии:

Общая идея состоит в том чтобы использовать возможность 9i выполнять запрос в запросе. Например я хочу получить первых 20 служащих

                  select * from ( 
                   select a.*, rownum rnum from 
                   			(select empname, empno from emp order by empname  ) a
	                where rownum <= 20 )
		where rnum >= 1

Следеющих 20 - меняем числа и так далее. Возникает 2 вопроса: 

  1. Насколько это эффективнее чем самому прочитать курсором и пропустить лишние ?
    • Когда Вы выполнили готовитесь извлекать записи из курсора то сервер должен быть готов отдать вам все записи. Поэтому Он выполнит запрос полностью и приготовиться его Вам отдать. Когда же вы явно указали что Вам не все записи, то сервер (если может) извлечет не все записи. Когда он может ? Когда в вашем запросе по которому Вы собираетесь ходить нет например агрегирующих функций. Т.е. для того чтобы отдать запись не приходилось извлекать все записи.
    • Убедитесь в вашем запросе обязательно используется индекс !.
  2. Если данные поменяются (например кто-то добавит запись), то во время перехода к следующей странице отображение может стать некорректным. Ведь запрос заново перечитает таблицу ?  
    • Если каждый новый запрос это новая транзакция то да, проблема существует. Выйти можно следующим способом. Например добавив дату создания записи в запрос. Так чтобы всегда при переходе к следующим страницам просить только те записи, которые существовали на момент 1 запроса. Конечно для web приложений требуется поддержка сессий.
    • Другой более сложный вариант - сбросить в временную таблицу rowid записей отвечающих вашему критерию и ходить потом по rowid этих записей. Но это скорее когда точно известно что будет просматриваться весь отчет в приложениях типа DSS.  
Q:  Как защитить колонку таблицы от просмотра ?

A: Если вы действительно хотите защитить от просмотра колонку таблицы, а не запись, то читать дальше. При выдаче гранта на select указание колонок не предусмотрено синтаксисом. Я не нашел разумного объяснения почему. Выдавать гранты на колонки можно только для insert и update. 

"You can restrict INSERT and UPDATE privileges for a table to specific columns of the table. With selective INSERT, a privileged user can insert a row with values for the selected columns. All other columns receive NULL or the column's default value. With selective UPDATE, a user can update only specific column values of a row. Selective INSERT and UPDATE privileges are used to restrict a user's access to sensitive data."

Остается только делать view. Читать документацию, раздел Data Definition Language Operations. 

Q:   Почему иногда в моей сессии процедура работает медленно?

A: Важно понимать разницу между тем, что не производительно работает процедура или запрос и тем, что иногда что-то случается в отдельных сессиях. Если Вам нужно отладить процедуру или запрос читайте здесь. Если проблемы наблюдаются в отдельных сессиях - давайте посмотрим что в ней реально происходит. Для этого лучше всего взять скрипт session_waits знаменитого Стива Адамса (www.ixora.com.au). Правда для его работы нужно будет выяснить SID вашей сессии и определить эту переменную до запуска скрипта :

SQL> define Sid=42;   ---  в этом примере мой SID = 42. Я подсмотрел его из соседней сесси в табличке v$session

SQL> выполнить проблемную процедуру

SQ> @session_times

 

Q:   Как модифицировать подсказку sqlplus ?

A: Нужно внести изменения в $ORACLE_HOME/sqlplus/admin/glogin.sql (тогда для всех пользователей) или в файл login.sql текущей директории (тогда только для Вас)

Я использую подсказку вида 

Connected to:
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production

dsvolk@DVP8.1.7>

Где вывожу имя инстанса и версию СУБД. Взять мой login.sql. Перед его использованием дать команду 

grant select on V_$INSTANCE to public;

Q:   Почему у меня неправильно сортируются русские имена  ?

A: Дело в том что сортировку определяет параметр nls_sort. 

SQL> select * from nls_session_parameters where parameter = 'NLS_SORT';

PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_SORT BINARY


Если стоит binary то сделайте:

SQL> alter session set nls_sort = 'RUSSIAN';

Для русского это работает. 


Поддерживаемые языки здесь: 
http://download-west.oracle.com/docs/cd/A87860_01/doc/server.817/a76966/appa.htm#958510

При частых сортировка по определенному языку советуют создать лигвистический индекс:

http://download-west.oracle.com/docs/cd/A87860_01/doc/server.817/a76966/ch2.htm#95318
 

Q:   Как отправить почту из Oracle  ?

A: Сразу оговорюсь, что эта возможность позволяет отправить письма без вложений. Только простой текст, с возможностью использовать русский язык конечно. Вариант с вложениями требует установки Java Mail и подробно описан у Tom Kyte

Итак, сформируем заголовок письма 

g_output_buffer := 'To: "Greate SMAP admin"<smap>' || UTL_TCP.crlf ||
'From: "Smap Admin console"<smap>' || UTL_TCP.crlf ||
'Subject: Possible problem with smap'|| UTL_TCP.crlf ||
'Reply-To: smap@oracle.com'|| UTL_TCP.crlf ||
'Content-Type: text/plain; charset=koi8-r'|| UTL_TCP.crlf ||
'Content-Transfer-Encoding: 8bit'|| UTL_TCP.crlf ||chr(10)|| g_output_buffer;

Обратите внимание на charset в котором Вы будет формировать письмо

Теперь отсылаем письмо

g_mail_conn := sl_mail.openconnection (getsystemparam ('smtp_host')); -- Получим имя хоста 

sl_mail.send ( 
p_smtp_connection => g_mail_conn, 
p_from => getsystemparam ('smtp_from'),   -- Получим реальные имена для smtp сервера
p_to => getsystemparam ('smtp_to'),
p_message => g_output_buffer 
);
sl_mail.closeconnection (g_mail_conn);

Примеры использования можно найти в пакете dba_utils. Этот пакет и исходный код пакета sl_mail можно найти в пакете dba_utils. На самом деле, это выжимки из моей библиотеки BillProf.

Dsvolk > > Oracle > > Faq > > Dvp Last Modified: 19-05-2004 19:36