powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Люди, помогите с курсорами!!!!!!!
12 сообщений из 12, страница 1 из 1
Люди, помогите с курсорами!!!!!!!
    #32073743
slap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем у меня такая задачка: допустим у меня дана таблица с ФИО сотрудников, я в 1 курсор выбираю все ID етой таблицы, где имя соответствует запрашиваему во 2 курсор ID таблицы, где Фамилия соответствует искомой, в 3 курсор такж выбираю ID, где отчества соответствуют запрашиваемым

Подскажите, как мне пересеч курсоры, так чтобы получилось множество, котявляется пересечение 3-х множеств, на кот указывают курсоры, тобишь мне нужно получить подмножество Людей с искомым ФИО
...
Рейтинг: 0 / 0
Люди, помогите с курсорами!!!!!!!
    #32073744
Rescator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А при решении задачи обязательно пользоваться курсорами?
Можно же все одним запросом сделать.
...
Рейтинг: 0 / 0
Люди, помогите с курсорами!!!!!!!
    #32073764
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тоже так считаю, зачем так извращаться.
...
Рейтинг: 0 / 0
Люди, помогите с курсорами!!!!!!!
    #32073828
slap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините, прсто я имел ввиду другой случай, я немного не коректно сформулировал вопрос - у меня сущ. поисковая ф-я, кот ищет по етим полям, мне нужно чтоб она искала по любой комбинации заполненных полей, исключая пустые маски поиска
Нюанс еще и в том, что функцию придется расширять за счет поиска по другим свойствам, соответственно увеличивая набор полей и их комбинаций
вот вчем вопрос...
чтоб мне не писать для каждого случаю свои запросы...
...
Рейтинг: 0 / 0
Люди, помогите с курсорами!!!!!!!
    #32074067
nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
все равно это можно сделать одним запросом
select * from mytable
where famfield like decode(:fam,null,'%',:fam) and
namefield like decode(:name,null,'%',:name) and
otchfield like decode (:otch,null,'%',:otch)
или я чего не понял?
...
Рейтинг: 0 / 0
Люди, помогите с курсорами!!!!!!!
    #32074283
Silver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 (nick) :
Скорее всего -- действительно не понимаешь ...
1) Судя по (0) таблица явно не одна
2) Если поисковый параметр пустой (либо NULL, либо ``) зачем вообще по нему искать?
...
Рейтинг: 0 / 0
Люди, помогите с курсорами!!!!!!!
    #32074284
slap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, Сильвер прав, фича в чем, у меня несколько полей в таблице, мне нужно провести по ним пойиск, но не искать по тем полям, к кот не обращаются в запросе, тобишь если поисковое значение етого поля равно null или "" то зачем по нему искать?
...
Рейтинг: 0 / 0
Люди, помогите с курсорами!!!!!!!
    #32074286
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select ...
from table
where (param_1 is null or field1 = param_1)
and
(param_2 is null or field2 = param_2)
and
(param_3 is null or field3 = param_3)
и.т.д

стандартная схема пропука пустых параметов.
...
Рейтинг: 0 / 0
Люди, помогите с курсорами!!!!!!!
    #32074300
Billing Group
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такой запрос будет правильным:

SELECT name1, name2, name3
FROM CUSTOMER
WHERE NVL(:name_param1,name1) = name1
AND NVL(:name_param2,name2) = name2
AND NVL(:name_param3,name3) = name3


если входные Фам., Имя или Отч. будут пустыми, то по ним не будет производиться поиск в таблице.
Удачи!
...
Рейтинг: 0 / 0
Люди, помогите с курсорами!!!!!!!
    #32074406
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к Billing Group:

> SELECT name1, name2, name3
> FROM CUSTOMER
> WHERE NVL(:name_param1,name1) = name1
> AND NVL(:name_param2,name2) = name2
> AND NVL(:name_param3,name3) = name3

Такой запрос в принципе не правильный поскольку:
-- в случае :name_param1 is null и name1 is null что в результате
-- NVL(:name_param1,name1) полностью выключит индексы
и мы получим только и однозначно FULL SCAN TABLE

мой вариант тоже не полный т.к. не учитывал null/null значений
но в изначальной постановке null для параметра означал, что такой параметр проверять не надо.

полная схема проверки, которая сохраняет в живых индексы должна быть:
((param_1 is null or field1 = param_1) or (param_1 is null and field1 is null))
...
Рейтинг: 0 / 0
Люди, помогите с курсорами!!!!!!!
    #32074407
Billing Group
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShgGena, вообще-то, человек задающий вопрос не упоминал об индексах. Но если тема зашла о них, то в приведенном мною примере, в случае если параметр IS NULL, никак не приведет к полному сканированию таблицы по даному столбцу. Уже сам индекс говорит, что сканировать будут его по FAST FULL SCAN или по RANGE SCAN или еще как-то. Но если подглянуть в Explain Plan, то сразу все станет на свои места.
...
Рейтинг: 0 / 0
Люди, помогите с курсорами!!!!!!!
    #32074409
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем спорить просто я покужу разницу на примере, включая
execution plan --> это очень просто!!!

SQL> create table test_plan
2 as
3 select object_id, object_name, object_type
4 from all_objects;
Table created.
SQL> select count(*) from test_plan;
COUNT(*)
----------
23510
SQL> create index i1_test_plan on test_plan(object_id);
Index created.
SQL> create index i2_test_plan on test_plan(object_name);
Index created.
SQL> create index i3_test_plan on test_plan(object_type);
Index created.

SQL> analyze table test_plan compute statistics;
Table analyzed.

SQL> set autotrace traceonly;
SQL> select * from test_plan
2 where
3 (23 is null or object_id = 23)
4 and
5 (null is null or object_name = 'TEST_PLAN')
6 and
7 ('TABLE' is null or object_type = 'TABLE');
no rows selected
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=38)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST_PLAN' (Cost=2 Card=
1 Bytes=38)
2 1 BITMAP CONVERSION (TO ROWIDS)
3 2 BITMAP OR
4 3 BITMAP CONVERSION (FROM ROWIDS)
5 4 INDEX (RANGE SCAN) OF 'I1_TEST_PLAN' (NON-UNIQUE)
(Cost=1)

Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2 consistent gets
0 physical reads
...
0 rows processed

SQL> select * from test_plan
2 where
3 nvl(23,object_id) = object_id
4 and
5 nvl(null,object_name) = object_name
6 and
7 nvl('TABLE',object_type) = object_type;

no rows selected


Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=17 Card=1 Bytes=38)
1 0 TABLE ACCESS (FULL) OF 'TEST_PLAN' (Cost=17 Card=1 Bytes=3
8)

Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
149 consistent gets
0 physical reads
...
0 rows processed

Прошу обратить внимание на :
-- TABLE ACCESS (FULL) OF 'TEST_PLAN'
против
2 1 BITMAP CONVERSION (TO ROWIDS)
3 2 BITMAP OR
4 3 BITMAP CONVERSION (FROM ROWIDS)
5 4 INDEX (RANGE SCAN) OF 'I1_TEST_PLAN' (NON-UNIQUE)
(Cost=1)
поскольку версия 9i то при таких типах запросов оптимизатор
бубет пытаться применить onlinr битовые матрицы для выполниея запроса -- очень быстрый способ

а также на:
2 consistent gets
против
149 consistent gets
правда первый запрс смотрится в 30 раз эффективнее...
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Люди, помогите с курсорами!!!!!!!
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]