![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как передать результат селекта параметром в процедуру?
alsov1 © (2004-10-13 10:41:00)Приветствую Мастера!
Например:
Есть процедура add
с параметром Par in number
как в неё передать результат селекта
select id
from что-то
where что-то = чему-то;
не используя переменные???
что-то типа
execute add(select id
from что-то
where что-то = чему-то);
но такой вариант не проходит
Заранее спасибо
alsov1 (2004-10-13 15:12:00) [1]Жаль, очень жаль
Reindeer Moss Eater (2004-10-13 15:11:00) [2]Нельзя
alsov1 (2004-10-13 15:09:00) [3]select id into переменная;
процедура (переменная);
Можно ли обойтись без переменной, т.е
процедура (select id)
Reindeer Moss Eater (2004-10-13 15:01:00) [4]Если результат селекта вообще - то никак.
Если это селект результата функции то имя функции можно использовать как выражение и подставить в качестве фактического параметра.
alsov1 (2004-10-13 14:57:00) [5]понятно
но вопрос заключался ещё и в том, как передать в процедуру результат селекта без использования переменных
Reindeer Moss Eater (2004-10-13 14:22:00) [6]У меня 100 000 000 созданий элементов вложенной таблицы.
У тебя 2 x 100 000 000 переключений с контекста PL/SQL на контекст SQL и обратно.
Плюс 100 000 000 вызовов процедуры и 100 000 000 возвратов из нее.
Reindeer Moss Eater (2004-10-13 14:04:00) [7]Тогда прочитай еще раз пост № 11
alsov1 (2004-10-13 13:10:00) [8]В моём понимании Лучше значит быстрее
Reindeer Moss Eater (2004-10-13 12:58:00) [9]... лучше, чем генерация при вставке ???
Я плохо понимаю смысл терминов лучше/хуже красивее/некрасивее и так далее. Применительно к теме.
alsov1 (2004-10-13 12:55:00) [10]>А попробовать и сравнить страшно?
Я думал ты знаешь
Reindeer Moss Eater (2004-10-13 12:50:00) [11]А попробовать и сравнить страшно?
alsov1 (2004-10-13 12:48:00) [12]Ты не ответил: генерация в память а потом вставка работает лучше, чем генерация при вставке ???
А вот такое решение не лучше:
CREATE or replace PROCEDURE FillDatchik (
HowMany in number,
Id_myesto in number)
is BEGIN
declare
i number;
begin
for i in 1..HowMany loop
adddatchikfullparam (
dbms_Random.NORMAL,
dbms_Random.NORMAL,
dbms_Random.NORMAL,
ID_MYESTO,
trunc(dbms_Random.VALUE(10, 99999999)),
dbms_Random.STRING('p', 1),
sysdate);
end loop;
commit;
end;
END;
/
Reindeer Moss Eater (2004-10-13 12:45:00) [13]1.Внутри FORALL должна быть только одна DML инструкция (insert delete update)
2.Не требуется LOOP END LOOP
Доступно начиная с 8i
alsov1 (2004-10-13 12:38:00) [14]Но у тебя в коде сначала создаётся массив данных и только потом он записывается в БД.
Или я что-то не понимаю, или генерация в память а потом вставка работает лучше, чем генерация при вставке ???
Только что оракл 9 ругнулся на forall, у него какой-то свой синтаксис, отличающийся от for?
Reindeer Moss Eater (2004-10-13 12:29:00) [15]Инсетры сервер будет делать и у тебя и у меня.
Все 100 000 000
Но у тебя он кроме этого еще сто миллионов раз переключится с контекста на контекст и обратно.
alsov1 (2004-10-13 12:25:00) [16]для сервера
Reindeer Moss Eater (2004-10-13 12:18:00) [17]Лучше для кого?
Для тебя-писателя, или для сервера - исполнителя написанного?
alsov1 (2004-10-13 12:16:00) [18]>>3. Он и так у меня создается.
У тебя в коде написано
for i in 1 .. 100
loop
rand_arr.extend;
select dbms_Random.NORMAL,dbms_Random.NORMAL,dbms_Random.NORMAL into rand_arr(rand_arr.last).x,rand_arr(rand_arr.last).y,rand_arr(rand_arr.last).z from dual;
end loop;
Это создание 100 элементов, а если 100 000 000 создавать?
Получается что сначало создаётся таблица в памяти сервака с 100 000 000 записей, а потом эти данные загоняются в другую таблицу, т.е на хранение.
Не лучше ли будет писать данные сразу а таблицу на хранение, т.е делать инсерт.
Reindeer Moss Eater (2004-10-13 11:58:00) [19]1. Это вызов конструктора вложенной таблицы
2. Это создание нового элемента
3. Он и так у меня создается.
Цикл for очень полезно заменить на цикл forall (если у тебя 8i и выше).
Если этого не сделать, то сервер будет вынужден на каждой итерации цикла переключаться с контекста PL/SQL на контекст SQL.
А это требует времени.
4. Наздоровье
alsov1 (2004-10-13 11:52:00) [20]2Reindeer Moss Eater
Не понял вот что:
1. Что обозначает rand_arr := trand_arr();
2. Что обозначает rand_arr.extend;
3. Если мне нужно 100 000 000 записей родить, целесообразно ли сначала создавать массив данных в памяти?
Можно ли что-то типа такого написать:
for i in 1..100000000
loop
insert into some_table values(dbms_Random.NORMAL,dbms_Random.NORMAL,dbms_Random.NORMAL);
end loop;
4. Данные я заношу процедурой - она разносит их по разным таблицам - мне кажется так удобнее