Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как передать результат селекта параметром в процедуру?


Страницы:   1 2

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. Данные я заношу процедурой - она разносит их по разным таблицам - мне кажется так удобнее


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо