KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Валентин Озеров, "Советы по Delphi. Версия 1.4.3 от 1.1.2001" бесплатно, без регистрации.
Перейти на страницу:

Oracle 

Связь Oracle с Win95

Delphi 2 

Оптимизация связи Oracle с Windows 95

Предварительные условия:

• Windows 95

• Установленное клиентское программное обеспечение для доступа к Oracle & программа для соединения с Oracle Server через TCP/IP.

• (Опционально) Программное обеспечение Delphi 2.0 C/S для тестирования результатов.

Цель документа:

помочь увеличить скорость соединения Oracle под Windows 95. Под WinNT такая проблема не стоит, следовательно, данный документ рассматривает только работу с Windows 95. Ниже вы видите разницу в скорости выполнения запроса, выполненного до модификации, и после:

До : Win95 = 10-15 секунд. WinNT = 2-3 секунд.

После : Win95 = 3-4 секунд. (Большое улучшение)

Проблема: Windows 95 в сущности ищет адреса IPC в нескольких сетевых узлах ДО получения соединения с Oracle DNS, WinNT же поступает по другому.

Решение: Измените файл Oracle SQLNET.ORA для выключения вышеуказанной характеристики Windows 95.

Решение шаг-за-шагом:

1. Откройте в Notepad или Write файл SQLNET.ORA. (Данный файл расположен в каталоге <ORA_HOME>networkadmin. Проигнорируйте любые другие разновидности этого файла)

Данный файл должен выглядеть примерно следующим образом:

################

# Filename......: sqlnet.ora

# Node..........: local.world

# Date..........: 24-MAY-94 13:23:20

################

TRACE_LEVEL_CLIENT = OFF

sqlnet.expire_time = 15

names.default_domain = borland.world

name.default_zone = borland.world

Добавьте следующий параметр в файл SQLNET.ORA:

AUTOMATIC_IPC = OFF

После изменений файл должен выглядеть примерно так:

################

# Filename......: sqlnet.ora

# Node..........: local.world

# Date..........: 24-MAY-94 13:23:20

################

AUTOMATIC_IPC = OFF

TRACE_LEVEL_CLIENT = OFF

sqlnet.expire_time = 15

names.default_domain = borland.world

name.default_zone = borland.world

Сохраните измененный файл SQLNET.ORA и ура! В дальнейшем при инициализации соединения с Oracle время соединения вместо 15 секунд составит всего лишь 3 секунды. Скорость работы Delphi существенно увеличится. 

Возникла необходимость в обработке исключительных ситуаций в PL/SQL процедуре (Oracle7 WG Server Release 7.3.2.2.0). Почему у меня не получается?

Nomadic отвечает:

Объявить выборку SELECT * FROM CUSTOM.CAMAIN20TEMP WHERE CC_07_01=curCC_07_01 AND CC_07_02=curCC_07_02 AND CC_07_03=curCC_07_03 курсором, а потом примерно так:

loop

fetch_cursor;

выход когда фетчить больше нечего;

begin

INSERT INTO CUSTOM.CAMAIN20 чего нафетчили;

EXCEPTION

WHEN others THEN

BEGIN

DBMS_OUTPUT.PUT_LINE('ВВОД ДУБЛЯ В CUSTOM.CAMAIN20');

END

end

end loop; 

Поясните, чем в Oracle являются понятия Instance, Database etc.?

Nomadic отвечает:

Перевод документации:

Что такое ORACLE Database?

Это данные которые будут обрабатываться как единое целое. Database состоит из файлов операционной системы. Физически существуют database files и redo log files. Логически database files содержат словари, таблицы пользователей и redo log файлы. Дополнительно database требует одну или более копий control file.

Что такое ORACLE Instance?

ORACLE Instance обеспечивает программные механизмы доступа и управления database. Instance может быть запущен независимо от любой database (без монтирования или открытия любой database). Один instance может открыть только одну database. В то время как одна database может быть открыта несколькими Instance.

Instance состоит из:

SGA (System Global Area), которая обеспечивает коммуникацию между процессами;

до пяти (в последних версиях больше) бэкграундовых процессов.

От себя добавлю – database включает в себя tablespace, tablespace включает в себя segments (в одном файле данных может быть один или несколько сегментов, сегменты не могут быть разделены на несколько файлов). segments включают в себя extents. 

Как заставить Oracle анализировать все таблицы базы данных?

Nomadic отвечает:

Конечно, можно использовать DBMS_SQL, DBMS_JOB…

А можно и так:

#!/bin/sh

#

# Analyze all tables

#

SQLFILE=/tmp/analyze.sql LOGFILE=/tmp/analyze.log

echo @connect dbo/ [email protected]> $SQLFILE

$ORACLE_HOME/bin/svrmgrl <> $SQLFILE

connect dbo/passwd

SELECT 'TABLE', TABLE_NAME FROM all_tables WHERE owner = 'DBO';

EOF

echo exit>> $SQLFILE

cat $SQLFILE> $LOGFILE

cat $SQLFILE | $ORACLE_HOME/bin/svrmgrl>> $LOGFILE

cat $LOGFILE | /usr/bin/mailx –s 'Analyze tables' [email protected]

rm $SQLFILE rm $LOGFILE 

В режиме отладки приложения не разрешается доступ (открытие) базы данных. Как лечить?

Nomadic отвечает:

Необходимо отключить (деинсталлировать через Oracle Installer) Trace Service на клиенте – совет от ORACLE.

Глюк имеет место быть только под Windows NT 4.xx. 

Подскажите, как на Oracle 7.3.2.3 (Solaris x86) поменять compatible на 7.3.2.3 (c 7.1.0.0)?

Nomadic отвечает:

Ставить в initmybase.ora

compatible = "7.3.2.3"

и после старта с новым параметром сделать

ALTER DATABASE RESET COMPABILITY;

И рестартовать базу. 

Как настроить Personal Oracle с русским языком на корректную работу с числами и BDE?

Nomadic отвечает:

прописать в HKEY_LOCAL_MACHINESOFTWAREORACLE параметр:

NLS_NUMERIC_CHARACTERS = '.,'

или

после соединения с ORACLE выполнить

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,' 

Как в Oracle создать sequence с некоторого номера?

Одной строкой 

Nomadic отвечает:

create sequence minvalue 10; 

Как решать некоторые вопросы при подключении к Oracle?

Nomadic отвечает:

DD> 1. Все поля (TField), определенные в формах, имеющие типы TDateField,

DD> TSmallIntField – при открытии таблицы ругаются: Field «…» is not of

DD> expected type. Посмотрел – при переопределении их под Oracle'ом они

Чтобы «увидеть» integer-поля нужно в настройке Alias'а Oracle в BDE установить Enable Integers→True (и напрочь будет потерян Locate по этим якобы int/smallint полям). С датами, возможно, тоже надо разбираться через настройки Win & Oracle. У меня в Win дата формата «дд.мм.гггг», в Oracle NLS_LANG→AMERICAN_AMERICA.CL8MSWIN1251 и с датами все гут.

DD> 2. Используя в SQL

DD> строки типа 'SELECT XX FROM YY WHERE XX="QQQ"' мы поступали

DD> неправильно,

DD> т.к. двойные кавычки в Oracle обрабатываются не так, как в Btrieve.

Oracle в данном случае не при чем. Это глюк BDE. Лечилось просто – вместо обрамления двойными кавычками строкового значения, нужно обрамлять его с помощью #39, примерно так 

MySQLString := 'SELECT XX FROM YY WHERE XX='+#39+'QQQ'+#39;

Belsky Roman

(2:450/94.75)

SS> У кого-нибудь есть опыт по настройке BDE? Откликнитесь плиз! При

SS> попытке соединиться с базой вылезает ошибка: Vendor failed init!

SS> Delphi запускаю под 95. Hа всякий случай пути к BDE и ORAWINBIN я

SS> проставил! orant71.dll (родной или переименнованый ora72win.dll)

SS> закидывал куда угодно, но… все равно вылетает ошибка BDE Error

SS> 15879 Vendor failed init :-(

Клиент у тебя NT, как я понял?

• ora7x.dll – 32bit клиент для win95

• orant7x.dll – 32bit клиент для NT

• ora7xwin.dll – 16bit клиент для win

т.е. ora7xwin в Delphi3 вообще ставить бесполезно (16bit для 32bit appl). ora*71.dll у меня изначально к ORACLE 7.2 не коннектился – они там как-то резко сменили OCI. Правда потом ora72win.dll с Personal Oracle 7.3 работал, но все равно лучше, наверное, чтобы номер версии dll был не ниже версии сервера.

А вообще я 32bit дельфях в Vendor Init давно прописываю OCIW32.dll – он всегда для последней версии сервера с которым ты работаешь.

Это IMHO. Hо у меня Delphi3 и Delphi1 коннектятся как с Oracle 7.1 на Unix'е, так и с Personal Oracle 7.3 

WindowsNT 4.0 + Delphi 2.01 C/S + Oracle Client 7.3 + Oracle Server 7.3. После логина в базу данных возникает `EExternalError 0xC0000008`. Что делать?

Nomadic коротко отвечает:

A: (IA, SK): Снести Oracle Trace Collection Services.

Псевдонимы

Получение пути псевдонима и таблицы I

Delphi 1

Есть три способа сделать это… №1 годится только для постоянных псевдонимов BDE. №2 работает с BDE и локальными псевдонимами, и No3 работает с BDE и локальными псевдонимами, используя "тяжелый" путь, через вызовы DBI.

function GetDBPath1(AliasName: string): TFileName;

var ParamList: TStringList;

begin

 ParamList := TStringList.Create;

 with Session do try

  GetAliasParams(AliasName,ParamList);

  Result := UpperCase(ParamList.Values['PATH'])+'';

 finally

  Paramlist.Free;

 end;

end;


function GetDBPath2(AliasName: string): TFileName;

var

 ParamList: TStringList;

 i: integer;

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*