powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Динамический SQL в функции
14 сообщений из 14, страница 1 из 1
Динамический SQL в функции
    #39634828
KitKat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
У меня функция считает сумму по столбцу 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
Динамический SQL в функции
    #39634831
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KitKat,

добавь пробелов между апострофом и ключевыми словами where, and, and
...
Рейтинг: 0 / 0
Динамический SQL в функции
    #39634835
Фотография 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; 
...
Рейтинг: 0 / 0
Динамический SQL в функции
    #39634844
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KitKatпри этом таблицу я хочу передать в качестве параметра, так как нужны будут разные таблицы.Сделай вьюху с union all-ом всех таблиц и необходимость в dynamic sql отпадет. На забудь вытащить в нее признак для фильтрации "таблицы".
...
Рейтинг: 0 / 0
Динамический SQL в функции
    #39634857
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadСделай вьюху с union all-ом
Достаточно курсор объявить.
...
Рейтинг: 0 / 0
Динамический SQL в функции
    #39634864
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadKitKatпри этом таблицу я хочу передать в качестве параметра, так как нужны будут разные таблицы.Сделай вьюху с union all-ом всех таблиц и необходимость в dynamic sql отпадет. На забудь вытащить в нее признак для фильтрации "таблицы".особенно весело будет с десятком таблиц по трем разным линкам
...
Рейтинг: 0 / 0
Динамический SQL в функции
    #39634875
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadKitKatпри этом таблицу я хочу передать в качестве параметра, так как нужны будут разные таблицы.Сделай вьюху с union all-ом всех таблиц и необходимость в dynamic sql отпадет. На забудь вытащить в нее признак для фильтрации "таблицы".Судя по имени таблицы 'calls_00_022017', их будет море разливанное. Несколько на каждый месяц.
ИМХО, лучше заняться сбором всех таблиц в одну многопартийную. Но это уже другая история.
...
Рейтинг: 0 / 0
Динамический SQL в функции
    #39634877
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Egoрсбором всех таблиц в одну многопартийную.
От редакции зависит.
...
Рейтинг: 0 / 0
Динамический SQL в функции
    #39634881
Фотография Egoр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous, так я и говорю, что это уже другая история.
...
Рейтинг: 0 / 0
Динамический SQL в функции
    #39635111
KitKat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Egoр, спасибо!!!! Пробелы помогли.
...
Рейтинг: 0 / 0
Динамический SQL в функции
    #39635113
KitKat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Динамический SQL в функции
    #39635114
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KitKatВыдает ошибку в 5 строке (into Result)RTFM EXECUTE IMMEDIATE Statement (FAQ)
...
Рейтинг: 0 / 0
Динамический SQL в функции
    #39635521
ОкеанНадежды
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в immediate можно просто в using out параметр сделать
...
Рейтинг: 0 / 0
Динамический SQL в функции
    #39635537
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот несколько способов получить желаемое, включая обсуждавшийся чуть выше.

Код: 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
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Динамический SQL в функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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