Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Заполнение данных за два года помесячно / 20 сообщений из 20, страница 1 из 1
14.06.2017, 13:54
    #39471510
Валерка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение данных за два года помесячно
Есть оракловая таблица с 24 столбцами, в которые необходимо занести данные за два года помесячно. Строк примерно 20 тыс.
В FoxPro делалось просто: два цикла, по годам и месяцам, и заполнялось поле pole&gg$mm. Типа такого
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
for gg=2015 to 2016
     for mm=1 to 12
         --
         вычисляем значение переменной tmp
         --
         записываем в поле БД значение переменной
         repl pole&gg$mm with tmp
     endfor
endfor


Как такое реализовать на PL/SQL? Сколько искал, ничего не нашел...
...
Рейтинг: 0 / 0
14.06.2017, 13:57
    #39471513
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение данных за два года помесячно
Валерканеобходимо занести данныеinsert
...
Рейтинг: 0 / 0
14.06.2017, 14:15
    #39471526
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение данных за два года помесячно
Валерка,

В pl/sql также можно использовать вложенные for-циклы. Команда обновления записи в таблице - update. PL/SQL Language Reference .
...
Рейтинг: 0 / 0
14.06.2017, 14:23
    #39471530
Валерка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение данных за два года помесячно
Я наверно непонятно написал...
Вопрос не по синтаксису insert или update, там все понятно и хелпов полно.
Вопрос в том как избежать 24х повторений одного и того же а заполнить pole&gg&mm в цикле. То есть вместо

Код: plsql
1.
2.
3.
4.
5.
6.
7.
 вычислили переменную tmp
   заполнили pole201501=tmp
 вычислили переменную tmp
   заполнили pole201502=tmp
----
 вычислили переменную tmp
   заполнили pole201612=tmp



использовать цикл??
...
Рейтинг: 0 / 0
14.06.2017, 14:36
    #39471537
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение данных за два года помесячно
ВалеркаЯ наверно непонятно написал...
Вопрос не по синтаксису insert или update, там все понятно и хелпов полно.
Вопрос в том как избежать 24х повторений одного и того же а заполнить pole&gg&mm в цикле. То есть вместо

Код: plsql
1.
2.
3.
4.
5.
6.
7.
 вычислили переменную tmp
   заполнили pole201501=tmp
 вычислили переменную tmp
   заполнили pole201502=tmp
----
 вычислили переменную tmp
   заполнили pole201612=tmp



использовать цикл??Тебе следует отключать свое фокспрошное мышление.
Зачем использовать цикл если без него можно обойтись?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
insert into ...
select y.gg, m.mm, calc_tmp(gg, mm)
from
 (select '2015' gg from dual union all select '2016' from dual) y
cross join
 (select rownum mm from dual connect by rownum <= 12) m
order by 1, 2
...
Рейтинг: 0 / 0
14.06.2017, 14:52
    #39471553
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение данных за два года помесячно
Если нужно разложить по 12 полочкам то что положено в одну стопку, то можно например так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
with
-- gen year series 2015 - 2016
y ( yyyy ) as ( select level + 2014 from dual connect by level < 3)
--- gen month series 1 - 12
,m ( mm ) as ( select level from dual connect by level < 13 )
--  source table 
, s ( yyyy, mm, x ) as (select yyyy,mm,dbms_random.value(1,100) from y,m)
-- main select
select * from s
pivot (
sum(x) for mm in (
 1 as C1
,2 as C2
,3 as C3
,4 as C4
,5 as C5
,6 as C6
,7 as C7
,8 as C8
,9 as C9
,10 as C10
,11 as C11
,12 as C12
))
order by 1
/
...
Рейтинг: 0 / 0
14.06.2017, 15:27
    #39471594
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение данных за два года помесячно
Валеркаиспользовать цикл??ключевой вопрос не что использовать, а как хранятся исходные данные и зачем их куда-то перекладывать.
...
Рейтинг: 0 / 0
14.06.2017, 15:28
    #39471597
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение данных за два года помесячно
Валерка,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
SQL> ed
Wrote file afiedt.buf

  1* create table t (id int,pole17$01 number,pole17$02 number,pole17$03 number)
SQL> /

Table created.

SQL> insert into t(id) values (1);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from t;

        ID  POLE17$01  POLE17$02  POLE17$03
---------- ---------- ---------- ----------
         1

declare
 v_f number;
begin
for gg in 2017..2017 loop
     for mm in 1..3 loop
         --
         --вычисляем значение переменной tmp
         --
         v_f:=sin(gg*mm);
         --записываем в поле БД значение переменной
         --repl pole gg$mm with tmp
         null;
         execute immediate 'update t set pole'||substr(gg,-2)||'$'||to_char(mm,'fm00')
           ||'=:f where id=1' using v_f;
     end loop;
end loop;
end;
/

SQL> /

PL/SQL procedure successfully completed.

SQL> select * from t;

        ID  POLE17$01  POLE17$02  POLE17$03
---------- ---------- ---------- ----------
         1 ,097361914 ,193798704 ,288394035



....
stax
...
Рейтинг: 0 / 0
14.06.2017, 15:29
    #39471599
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение данных за два года помесячно
-2-,

Да не перекладывать ему надо, а обновить. repl в foxpro - это то же, что update в oracle.
...
Рейтинг: 0 / 0
14.06.2017, 16:08
    #39471624
Валерка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение данных за два года помесячно
20тыщ абонентов. по каждому из них нужно в таблицу закинуть расход помесячный.
cross join тут не поможет.
Pivot тоже не поможет,
А вот
stax.. execute immediate 'update t set pole'||substr(gg,-2)||'$'||to_char(mm,'fm00')||'=:f where id=1' using v_f;

то что доктор прописал!!!!
Спасибо огромнейшее
...
Рейтинг: 0 / 0
14.06.2017, 16:11
    #39471625
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение данных за два года помесячно
Валерка,


Доктор, видимо, про merge не слышал. Но на твоих объемах пофиг.
...
Рейтинг: 0 / 0
14.06.2017, 16:18
    #39471629
Валерка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение данных за два года помесячно
dbms_photoshop,

merge штука хорошая. Но мне кажется конкретно в моей ситуацией она врядли поможет. Хотя покопаюсь, может я не прав....
...
Рейтинг: 0 / 0
14.06.2017, 16:25
    #39471634
Заполнение данных за два года помесячно
Валеркамне кажется
аргумент.
...
Рейтинг: 0 / 0
14.06.2017, 16:29
    #39471636
Валерка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение данных за два года помесячно
ВалерончикВалеркамне кажется
аргумент.
merge использовал всего пару раз за 6 лет работы, поэтому и "кажется"
...
Рейтинг: 0 / 0
14.06.2017, 16:32
    #39471639
Заполнение данных за два года помесячно
Валеркаmerge использовал всего пару раз за 6 лет работы, поэтому и "кажется"
А, ну тогда да. Извини.
...
Рейтинг: 0 / 0
15.06.2017, 08:31
    #39471883
Заполнение данных за два года помесячно
ВалеркаВалерончикпропущено...

аргумент.
merge использовал всего пару раз за 6 лет работы, поэтому и "кажется"

А когда кажется, то креститься надо!
...
Рейтинг: 0 / 0
15.06.2017, 08:33
    #39471886
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение данных за два года помесячно
Валеркато что доктор прописал!!!!
Спасибо огромнейшее
я привел как пример, мож так и не надо делать

я б вычислил 24значения (в переменные, или в массив не столь важно)
и менял данные одним
update t set p01=v1,p02=v2 ... p24=v24 where ...

.....
stax
...
Рейтинг: 0 / 0
15.06.2017, 09:34
    #39471924
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение данных за два года помесячно
Стас,

А чего не пивотом, раз ограниченное множество столбцов?
...
Рейтинг: 0 / 0
15.06.2017, 10:19
    #39471958
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение данных за два года помесячно
envСтас,

А чего не пивотом, раз ограниченное множество столбцов?

не умею я update пивотом

....
stax
...
Рейтинг: 0 / 0
15.06.2017, 12:37
    #39472168
Валерка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение данных за два года помесячно
stax..я б вычислил 24значения (в переменные, или в массив не столь важно)
и менял данные одним
update t set p01=v1,p02=v2 ... p24=v24 where ...

Это первое, что пришло в голову. Но как-то не красиво, нудно...
Сегодня с execute immediate всё сделал буквально минут за 15 минут. Так что еще раз спасибо...
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Заполнение данных за два года помесячно / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]