Текущий архив: 2004.11.14;
Скачать: CL | DM;
ВнизКак передать результат селекта параметром в процедуру? Найти похожие ветки
← →
alsov1 (2004-10-13 10:41) [0]Приветствую Мастера!
Например:
Есть процедура add
с параметром Par in number
как в неё передать результат селекта
select id
from что-то
where что-то = чему-то;
не используя переменные???
что-то типа
execute add(select id
from что-то
where что-то = чему-то);
но такой вариант не проходит
Заранее спасибо
← →
stud © (2004-10-13 10:58) [1]может лучше объяснить смысл подобной процедуры?
и субд?
← →
alsov1 (2004-10-13 11:05) [2]Нужно заполнить таблицу фигнёй для тестов скорости
Вот например процедура заполнения:
CREATE or replace PROCEDURE FillMyesto (
HowMany in number,
Id_myesto in number)
is BEGIN
declare
i number;
V_KOORDINATA_X number;
V_KOORDINATA_Y number;
V_KOORDINATA_Z number;
-- V_ID___MYESTO number;
V_PYERIOD_OPROSA number;
V_SOSTOYANIYE char;
V_DATA_I_VRYEMYA_USTANOVKI timestamp;
begin
for i in 1..HowMany loop
select dbms_Random.NORMAL into V_KOORDINATA_X from dual;
select dbms_Random.NORMAL into V_KOORDINATA_Y from dual;
select dbms_Random.NORMAL into V_KOORDINATA_Z from dual;
select abs(dbms_Random.RANDOM) into V_PYERIOD_OPROSA from dual;
select dbms_Random.STRING("p", 1) into V_SOSTOYANIYE from dual;
select sysdate into V_DATA_I_VRYEMYA_USTANOVKI from dual;
-- Заношу данные
adddatchikfullparam (
V_KOORDINATA_X,
V_KOORDINATA_Y,
V_KOORDINATA_Z,
ID_MYESTO,
V_PYERIOD_OPROSA,
V_SOSTOYANIYE,
V_DATA_I_VRYEMYA_USTANOVKI);
end loop;
commit;
end;
END;
/
Хочу избавиться от переменных и передавать параметром в процедуру результат селекта
← →
Reindeer Moss Eater © (2004-10-13 11:14) [3]Боже ж ты мой.
Изнасиловать Оракл в такой извращенной форме.
← →
alsov1 (2004-10-13 11:31) [4]2Reindeer Moss Eater
По делу подскажи, я в оракле новичок.
← →
Reindeer Moss Eater © (2004-10-13 11:37) [5]declare
type trand_rec is record(
x number,
y number,
z number
);
type trand_arr is table of trand_rec;
rand_arr trand_arr;
begin
rand_arr := trand_arr();
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;
forall i in rand_arr.first .. rand_arr.last
loop
insert into some_table values(rand_arr(i).x,rand_arr(i).y,rand_arr(i).z);
end loop;
end;
← →
alsov1 (2004-10-13 11:52) [6]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. Данные я заношу процедурой - она разносит их по разным таблицам - мне кажется так удобнее
← →
Reindeer Moss Eater © (2004-10-13 11:58) [7]1. Это вызов конструктора вложенной таблицы
2. Это создание нового элемента
3. Он и так у меня создается.
Цикл for очень полезно заменить на цикл forall (если у тебя 8i и выше).
Если этого не сделать, то сервер будет вынужден на каждой итерации цикла переключаться с контекста PL/SQL на контекст SQL.
А это требует времени.
4. Наздоровье
← →
alsov1 (2004-10-13 12:16) [8]>>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 12:18) [9]Лучше для кого?
Для тебя-писателя, или для сервера - исполнителя написанного?
← →
alsov1 (2004-10-13 12:25) [10]для сервера
← →
Reindeer Moss Eater © (2004-10-13 12:29) [11]Инсетры сервер будет делать и у тебя и у меня.
Все 100 000 000
Но у тебя он кроме этого еще сто миллионов раз переключится с контекста на контекст и обратно.
← →
alsov1 (2004-10-13 12:38) [12]Но у тебя в коде сначала создаётся массив данных и только потом он записывается в БД.
Или я что-то не понимаю, или генерация в память а потом вставка работает лучше, чем генерация при вставке ???
Только что оракл 9 ругнулся на forall, у него какой-то свой синтаксис, отличающийся от for?
← →
Reindeer Moss Eater © (2004-10-13 12:45) [13]1.Внутри FORALL должна быть только одна DML инструкция (insert delete update)
2.Не требуется LOOP END LOOP
Доступно начиная с 8i
← →
alsov1 (2004-10-13 12:48) [14]Ты не ответил: генерация в память а потом вставка работает лучше, чем генерация при вставке ???
А вот такое решение не лучше:
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:50) [15]А попробовать и сравнить страшно?
← →
alsov1 (2004-10-13 12:55) [16]>А попробовать и сравнить страшно?
Я думал ты знаешь
← →
Reindeer Moss Eater © (2004-10-13 12:58) [17]... лучше, чем генерация при вставке ???
Я плохо понимаю смысл терминов лучше/хуже красивее/некрасивее и так далее. Применительно к теме.
← →
alsov1 (2004-10-13 13:10) [18]В моём понимании Лучше значит быстрее
← →
Reindeer Moss Eater © (2004-10-13 14:04) [19]Тогда прочитай еще раз пост № 11
← →
Reindeer Moss Eater © (2004-10-13 14:22) [20]У меня 100 000 000 созданий элементов вложенной таблицы.
У тебя 2 x 100 000 000 переключений с контекста PL/SQL на контекст SQL и обратно.
Плюс 100 000 000 вызовов процедуры и 100 000 000 возвратов из нее.
← →
alsov1 (2004-10-13 14:57) [21]понятно
но вопрос заключался ещё и в том, как передать в процедуру результат селекта без использования переменных
← →
Reindeer Moss Eater © (2004-10-13 15:01) [22]Если результат селекта вообще - то никак.
Если это селект результата функции то имя функции можно использовать как выражение и подставить в качестве фактического параметра.
← →
alsov1 (2004-10-13 15:09) [23]select id into переменная;
процедура (переменная);
Можно ли обойтись без переменной, т.е
процедура (select id)
← →
Reindeer Moss Eater © (2004-10-13 15:11) [24]Нельзя
← →
alsov1 (2004-10-13 15:12) [25]Жаль, очень жаль
Страницы: 1 вся ветка
Текущий архив: 2004.11.14;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.034 c