Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];

Вниз

Как передать результат селекта параметром в процедуру?   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.035 c
4-1097055635
3fc
2004-10-06 13:40
2004.11.14
Вывод текста под углом средствами WinAPI


3-1097393378
Vladgul
2004-10-10 11:29
2004.11.14
Создание собственной БД


6-1092936315
Фёдор Мегатронов
2004-08-19 21:25
2004.11.14
Две функции возвращают белеберду в место размера файла в инете


4-1096824789
clampo
2004-10-03 21:33
2004.11.14
Регистрация типов файлов


1-1098453965
kalishenko
2004-10-22 18:06
2004.11.14
QReport





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский