Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.047 c
1-1099051583
bloodman
2004-10-29 16:06
2004.11.14
Где можно найти информацию по теории распозанания текста


1-1099386098
Некто
2004-11-02 12:01
2004.11.14
За пределы формы


1-1099130123
Artemiy2004
2004-10-30 13:55
2004.11.14
Как скопировать небольшую часть картинки в новый битмап?


14-1098276497
Cosinus
2004-10-20 16:48
2004.11.14
Господа, к кому можно обратиться по поводу архивов форумов?


4-1096971769
Shira333
2004-10-05 14:22
2004.11.14
Обработка нажатия чужой кнопки...