powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли в ORACLE использовать макроподстановки
11 сообщений из 11, страница 1 из 1
Можно ли в ORACLE использовать макроподстановки
    #32107748
leva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПРИМЕР
re_z.flg1 .... re_z.flg12 рассчитаные переменные и их значения определены
В зависимости от даты надо вычислить сумму su_flg за mm месяцев

for ii in 1..to_number(to_char(pdt,'mm'))
loop
pim := 're_z.flg'||to_char(ii);
su_flg := su_flg + значение(pim);
end loop;

Как такое можно реализовать ???
...
Рейтинг: 0 / 0
Можно ли в ORACLE использовать макроподстановки
    #32107759
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно так, по псевдокоду:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
su_flg :=  0 ;
su_flg2 :=  0 ;
for ii in  1 ..to_number(to_char(pdt,'mm')) loop
  su_flg2 := su_flg; 
  execute immediate 'begin :su_flg := :su_flg2 + re_z.flg2'||to_char(ii)||'; end;' 
  using out su_flg, su_flg2;
end loop; 
...
Рейтинг: 0 / 0
Можно ли в ORACLE использовать макроподстановки
    #32108008
leva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Примерно так, по псевдокоду:

declare
su_flg number := 0;
su_flg2 number:= 0;
pdt date := '25-02-2002';
RE_ZFL1 number :=5;
RE_ZFL2 number :=10;

begin
for ii in 1..to_number(to_char(pdt,'mm')) loop
su_flg2 := su_flg;
execute immediate 'begin :su_flg := :su_flg2 + re_zfl'||to_char(ii)||'; end;'
using out su_flg, su_flg2;
end loop;
dbms_output.put_line(su_flg);
end;

ORA-06550: line 1, column 29:
PLS-00201: identifier 'RE_ZFL1' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
ORA-06512: at line 11

А так что-то не проходит. Не видит он RE_ZFL1 .
...
Рейтинг: 0 / 0
Можно ли в ORACLE использовать макроподстановки
    #32108057
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что они объявлены в самом pl/sql блоке, и область видимости их этим самым блоком и заканчивается. А Native SQL выполняется, не знаю как точно это определяется, вне контекста pl/sql блока. Выход- объявить переменные где-нибудь, к примеру:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create or replace package pkg_const as
  re_zfl1 number :=  5 ;
  re_zfl2 number :=  10 ;
end;
/

declare
  su_flg number :=  0 ;
  su_flg2 number:=  0 ;
  pdt date := to_date('25-02-2002', 'dd-mm-yyyy');
begin
  for ii in  1 ..to_number(to_char(pdt,'mm')) loop
    su_flg2 := su_flg;
    execute immediate 'begin :su_flg := :su_flg2 + pkg_const.re_zfl'||to_char(ii)||'; end;'
    using out su_flg, su_flg2;
  end loop;
  dbms_output.put_line(su_flg);
end;
/
...
Рейтинг: 0 / 0
Можно ли в ORACLE использовать макроподстановки
    #32115416
leva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>А Native SQL выполняется, не знаю как точно это определяется, вне >контекста pl/sql блока. Выход- объявить переменные где-нибудь, к примеру

Все правильно так работает. Но ситуация немного другая - в процедуре открываем курсор с параметрами процедуры и получаем запись
курсор%rowtype с полями (z1....z12 ....). Так как все же мне проще найти сумму z1+...zNN (где NN -цифра 1-12). Обьявить курсор%rowtype заранее в пакете я не могу . Может быть есть возможность обьявить переменную
%ROWTYPE не привязанную к конкретной таблице или курсору, а затем передать ей значение конкретного курсор%rowtype.

Заранее ВСЕМ благодарен.
...
Рейтинг: 0 / 0
Можно ли в ORACLE использовать макроподстановки
    #32115464
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поясни, если у тебя поля строко от 1-го до 12-ти, то зачем нужны макроподстановки? Может их просто сложить? Или набор и/или имена полей могут различаться?
...
Рейтинг: 0 / 0
Можно ли в ORACLE использовать макроподстановки
    #32115528
leva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Денису!
Пишется приложение где многое завязано на даты. Набор и/или имена полей могут меняться (если бы надо было разово, то проблемы не было - тупо бы написать если так то получим то-то, а хотелось бы иметь функцию или процедуру на вход которой подавалось бы неполное имя и цифра, а на выходе бы иметь результат (сумму,произведение...и др. )). И вообщем то все это делается как ты описал выше, но в случае с курсором я не могу обьявить переменную заранее (в пакете). А в процедуре значения всех переменных определенны.
Может что-то коряво обьяснил - спрашивайте.
...
Рейтинг: 0 / 0
Можно ли в ORACLE использовать макроподстановки
    #32115566
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, курсор состоит из одной записи- перечисление параметров? Возникла мысль использовать объектный тип-таблицу, заполнять ее значениями и отдавать дальше. Приведи пример одного-двух запросов, только не очень больших, достаточных для понимания сути задачи.
...
Рейтинг: 0 / 0
Можно ли в ORACLE использовать макроподстановки
    #32115592
leva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача - табельный учет и расчет зарплаты - курсор состоит из одной записи(собираются данные из нескольких таблиц по одному работнику в разрезе месяцев ) Насчет примера запроса сложнее (вернее не знаю что он даст) он срабатывает правильно

cursor cu_ud is
select * from
(select
c.tn itn ,
sum(decode(to_number(to_char(a.dt,'MM')),1,a.summa*b.p15)) s1,
sum(decode(to_number(to_char(a.dt,'MM')),2,a.summa*b.p15)) s2,
.....
sum(decode(to_number(to_char(a.dt,'MM')),12,a.summa*b.p15)) s12,
sum(a.summa*b.p14) sucp,
sum(a.summa*b.p16) sump
--
from zsna a, zsnu b, zsrab c
--
where c.tn=a.tn and b.shifr=a.shifr
and c.tn=ptn
--
group by c.tn) , (select
sum(decode(d.shifr,71,d.summa,0)) udcn
from zsud d
where d.tn=ptn) ;
В зависимости от даты на входе процедуры надо получить сумму (S1...sNN),где NN - месяц даты, кроме того значения S1... используются в процедуре для расчета других переменных
...
Рейтинг: 0 / 0
Можно ли в ORACLE использовать макроподстановки
    #32115682
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО выяснять набор полей у курсора- неблагодарное занятие, особенно если эти поля заранее неизвесты. Я бы переписал запрос, делал не

Код: plaintext
1.
2.
  
sum(decode(to_number(to_char(a.dt,'MM')),  1 ,a.summa*b.p15))


а

Код: plaintext
1.
2.
3.
sum(a.summa*b.p15)
...
group by trunc(a.dt,'MM')


получилось бы одно поле, которое и просуммировал.
...
Рейтинг: 0 / 0
Можно ли в ORACLE использовать макроподстановки
    #32115765
leva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Денис! Спасибо за идею.Обязательно попробую.Сам занимаюсь ORACLE недавно и хотелось бы разобраться что здесь можно ,что нельзя и понять сам принцип именно программирования. Ведь проблема то в чем ? проссумировать известные значения и такие сложности...
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли в ORACLE использовать макроподстановки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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