Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Динамический SQL в функции / 14 сообщений из 14, страница 1 из 1
23.04.2018, 15:25
    #39634828
KitKat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL в функции
Добрый день!
У меня функция считает сумму по столбцу in_balance, при этом таблицу я хочу передать в качестве параметра, так как нужны будут разные таблицы. Использую EXECUTE IMMEDIATE. Функция успешно создается, но при ее применении вылетает ошибка..Помогите, пожалуйста, что не так??

Функция:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
create or replace function get_charge_tr(v_subs in bis.subscribers.subs_id%TYPE,v_clnt in bis.clients.clnt_id%TYPE,tbl_name in varchar2) return number is
  Result number;
begin
 execute immediate 'select sum(in_balance_$) from ' || tbl_name || 'where main_clnt_id=' || v_clnt || 'and subs_subs_id=' || v_subs || 'and 
 rsta_rsta_id is null' into Result; 
 return(Result);
end get_charge_tr;



При выполнении запроса ошибка. На картинке.
Код: plsql
1.
2.
select n.msisdn, m_pavlova_ev.get_charge_tr(n.subs_id,n.clnt_id,'calls_00_022017')
from m_pavlova_ev.det_nach n
...
Рейтинг: 0 / 0
23.04.2018, 15:32
    #39634831
Egoр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL в функции
KitKat,

добавь пробелов между апострофом и ключевыми словами where, and, and
...
Рейтинг: 0 / 0
23.04.2018, 15:36
    #39634835
Egoр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL в функции
KitKat,

И посмотри на конструкцию с параметрами
Код: plsql
1.
2.
3.
4.
5.
 execute immediate 'select sum(in_balance_$) from ' || tbl_name || '
where main_clnt_id= :main_clnt_id
and subs_subs_id= :subs_subs_id
and rsta_rsta_id is null' using in v_clnt, in v_subs
into Result; 
...
Рейтинг: 0 / 0
23.04.2018, 15:48
    #39634844
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL в функции
KitKatпри этом таблицу я хочу передать в качестве параметра, так как нужны будут разные таблицы.Сделай вьюху с union all-ом всех таблиц и необходимость в dynamic sql отпадет. На забудь вытащить в нее признак для фильтрации "таблицы".
...
Рейтинг: 0 / 0
23.04.2018, 16:13
    #39634857
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL в функции
AmKadСделай вьюху с union all-ом
Достаточно курсор объявить.
...
Рейтинг: 0 / 0
23.04.2018, 16:18
    #39634864
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL в функции
AmKadKitKatпри этом таблицу я хочу передать в качестве параметра, так как нужны будут разные таблицы.Сделай вьюху с union all-ом всех таблиц и необходимость в dynamic sql отпадет. На забудь вытащить в нее признак для фильтрации "таблицы".особенно весело будет с десятком таблиц по трем разным линкам
...
Рейтинг: 0 / 0
23.04.2018, 16:29
    #39634875
Egoр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL в функции
AmKadKitKatпри этом таблицу я хочу передать в качестве параметра, так как нужны будут разные таблицы.Сделай вьюху с union all-ом всех таблиц и необходимость в dynamic sql отпадет. На забудь вытащить в нее признак для фильтрации "таблицы".Судя по имени таблицы 'calls_00_022017', их будет море разливанное. Несколько на каждый месяц.
ИМХО, лучше заняться сбором всех таблиц в одну многопартийную. Но это уже другая история.
...
Рейтинг: 0 / 0
23.04.2018, 16:30
    #39634877
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL в функции
Egoрсбором всех таблиц в одну многопартийную.
От редакции зависит.
...
Рейтинг: 0 / 0
23.04.2018, 16:35
    #39634881
Egoр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL в функции
andrey_anonymous, так я и говорю, что это уже другая история.
...
Рейтинг: 0 / 0
24.04.2018, 08:01
    #39635111
KitKat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL в функции
Egoр, спасибо!!!! Пробелы помогли.
...
Рейтинг: 0 / 0
24.04.2018, 08:02
    #39635113
KitKat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL в функции
EgoрKitKat,

И посмотри на конструкцию с параметрами
Код: plsql
1.
2.
3.
4.
5.
 execute immediate 'select sum(in_balance_$) from ' || tbl_name || '
where main_clnt_id= :main_clnt_id
and subs_subs_id= :subs_subs_id
and rsta_rsta_id is null' using in v_clnt, in v_subs
into Result; 




Выдает ошибку в 5 строке (into Result)
...
Рейтинг: 0 / 0
24.04.2018, 08:06
    #39635114
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL в функции
KitKatВыдает ошибку в 5 строке (into Result)RTFM EXECUTE IMMEDIATE Statement (FAQ)
...
Рейтинг: 0 / 0
24.04.2018, 16:38
    #39635521
ОкеанНадежды
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL в функции
в immediate можно просто в using out параметр сделать
...
Рейтинг: 0 / 0
24.04.2018, 17:11
    #39635537
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический SQL в функции
Вот несколько способов получить желаемое, включая обсуждавшийся чуть выше.

Код: 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.
51.
52.
declare

  v_clnt number := 1;
  v_subs number := 1;
  Result number;
  tbl_name varchar2(2000) := 't';
  
  l_stmnt varchar2(32767) := 
           'with t(in_balance_$, main_clnt_id, subs_subs_id, rsta_rsta_id) as (select 1000, 1, 1, null from dual connect by level <=5)'||
                'select sum(in_balance_$) from ' || tbl_name 
             || ' where main_clnt_id = :main_clnt_id '
             || ' and subs_subs_id = :subs_subs_id'
             || ' and rsta_rsta_id is null' 
          ;  
  type t_cur is ref cursor;
  c_cur t_cur;
  ------------------------------------------------------------
  cursor c (v_period date, v_clnt number, v_subs number) is 
  with t1 (period, in_balance_$, main_clnt_id, subs_subs_id, rsta_rsta_id) as (
          select date'2018-01-01', 1000, 1, 1, null from dual connect by level <=5
       )
     , t2 (period, in_balance_$, main_clnt_id, subs_subs_id, rsta_rsta_id) as (
          select date'2018-02-01', 1000, 1, 1, null from dual connect by level <=8
       )
  select sum(in_balance_$) s from t1 
   where period = v_period -- for partition pruning (even on standard edition)
     and main_clnt_id = v_clnt and subs_subs_id = v_subs and rsta_rsta_id is null
  UNION ALL
  select sum(in_balance_$) from t2 
   where period = v_period -- for partition pruning
     and main_clnt_id = v_clnt and subs_subs_id = v_subs and rsta_rsta_id is null
  ;
              
begin
------------------------------  
 execute immediate l_stmnt
  into Result
  using in v_clnt, in v_subs; 
 dbms_output.put_line(Result);
------------------------------ 
 open c_cur for l_stmnt using in v_clnt, in v_subs;
 loop
   fetch c_cur into Result;
   exit when c_cur%notfound;
 end loop;
 close c_cur;
 dbms_output.put_line(Result);
------------------------------ 
 for i in c (date'2018-01-01', v_clnt, v_subs) loop
   dbms_output.put_line(i.s);
 end loop;
end;
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Динамический SQL в функции / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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