Программирование >>  Oracle 

1 ... 437 438 439 [ 440 ] 441 442 443 ... 469


Пакет DBMS UTILITY

1743

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

71 for i in l hash .. least(l hash+1000, nvl(g hashtable.count,0))

72 loop

7 3 - Если обнаружили ПУСТОЙ слот, мы ЗНАЕМ, что искомого

7 4 - значения в таблице нет, поскольку он должен был быть

-> помещен в этот слот.

75 if (g hash table(i) is NULL)

then

return NULL; end if;

- Если ключ найден, вернуть соответствующее значение. if(g hash table(i).key = p key)

then

return g hash table(i).val; end if;

end loop;

76 77

80 81 82 83

85 86 87 88

89 end;

- Ключа в таблице нет. return null;

Завершаем работу.

Последняя процедура используется для выдачи полезной информации, например, о количестве выделенных и использованных слотов, а также о количестве конфликтов. Учтите, что количество конфликтов может превосходить размер таблицы!

97 98

101 102 103 104 105

107 108 109 110 111

112 113 114 115 116

member procedure print stats is

l used number default 0; begin

for i in 1 .. nvl(g hash table.count,0) loop

if (g hash table(i) is not null) then

l used := l used + 1; end if;

end loop;

dbms output.put line(Таблица увеличена до.....

g hash table.count); dbms output.put line( Mi используем..........

l used);

dbms output.put line(Количество конфликтов...

g collision cnt);

end;

end; /

Type body created.



1744 Приложение

Как видите, мы использовали функцию GET HASH VALUE для получения по строке числа, которое можно использовать для индексации табличного типа и выборки значения. Теперь можно рассмотреть, как используется этот новый тип:

tkyte@TKYTE816> declare

2 l hashTblhashTableType :=hashTableType.new(power(2,7)) ;

3 begin

4 for x in (select username, created from all users)

5 loop

6 l hashTbl.put(x.username, x.created);

7 end loop; 8

9 for x in (select username, to char(created) created,

10 l hashTbl.get(username) hash

11 from all users)

12 loop

13 if (nvl(x.created, x) onvl(x.hash,x))

14 then

15 raise program error;

16 end if;

17 end loop;

19 l hashTbl.print stats;

20 end;

21 /

Таблица увеличена до.....12 0

Используется.............17

Количество конфликтов....1

PL/SQL procedure successfully completed.

Вот и все. Мы расширили возможности языка PL/SQL, добавив хеш-таблицу на базе стандартных пакетов.

Резюме

Мы завершаем обзор основных подпрограмм пакета DBMS UTILITY. Многие из них, в частности GET TIME, GET PARAMETER VALUE, GET HASH VALUE и FORMAT CALL STACK, входят в мой список часто даваемых ответов . Это означает, что именно они необходимы для решения многих проблем. Пользователи просто не знают о существовании этих подпрограмм.



Пакет UTL FILE

Стандартный пакет UTL FILE позволяет читать и создавать текстовые файлы в файловой системе сервера в среде PL/SQL. Здесь существенны следующие ключевые слова.

Текстовые файл1. Пакет UTL FILE позволяет читать и создавать простые текстовые файлы. В частности, его нельзя использовать для чтения или создания двоичных файлов. Специальные символы, содержащиеся в двоичных данных, приводят к некорректной работе пакета UTL FILE.

В файловой системе сервера. Пакет UTL FILE позволяет читать и записывать файлы только в файловой системе сервера баз данных. Он не позволяет читать или записывать в файловую систему компьютера, на котором работает клиент, если последний не подключен локально к серверу.

Пакет UTL FILE подходит для создания отчетов и сброса данных из базы в текстовые файлы, а также для чтения и загрузки данных. В главе 9 первой части книги представлен полный пример использования пакета UTL FILE для создания текстового файла в формате, упрощающем загрузку. Пакет UTL FILE также помогает при отладке. В главе 21, посвященной средствам тщательного контроля доступа, представлен пакет DEBUG. Этот пакет интенсивно использует средства пакета UTL FILE для записи сообщений в файловую систему.

Пакет UTL FILE - очень полезен, но, используя его, нужно помнить об определенных ограничениях. В противном случае результаты могут оказаться некорректными (причем, выявиться это может не при тестировании, а при внедрении) и вызовут разочарование.



1 ... 437 438 439 [ 440 ] 441 442 443 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика