| 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 запроса. Конечно для 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. |