Как я могу разделить параметр в PLSQL - PullRequest
0 голосов
/ 12 мая 2019

Привет, ребята. Как я могу разделить параметр в plsql purun_kod, как 100,150,255,777, и я хочу разделить его и назначить v_urun_kod
спасибо за вашу помощь.Мой код выглядит примерно так:

function police_ara( purun_kod       in acente.levha_no%type,
                      ppolice_no      in varchar2) return sys_refcursor is
    vret sys_refcursor;
    v_urun_kod varchar(1000); 
  begin
    v_urun_kod := purun_kod;
  open vret for
      with policeler as
       (select distinct ph.police_hareket_id ph_police_hareket_id,
                        p.urun_kod
                        (select max(pho.police_hareket_id) from police_hareket_otr pho
            where pho.police_hareket_id = ph.police_hareket_id
           and (pho.durum_kod1 = 0 or pho.durum_kod2 = 0 or pho.durum_kod3 = 0 or pho.durum_kod4 = 0)) pho_police_hareket_id,

                        ph.odeme_arac_kod,
                        ph.police_id
         from police p
         inner join police_hareket ph
           and (ph.ekbelge_no>0 or (select count(1)
                  from police_kotasyon pk
                 where pk.police_hareket_id = ph.police_hareket_id 
                   and pk.kotasyon_seviyesi = 3
                   and rownum = 1)>0)
          left join police_prim pp
            on (pp.police_hareket_id = ph.police_hareket_id and pp.para_birim_kod = ph.para_birim_kod)
          left join musteri_rol mr
            on (mr.musteri_rol_id = pa.acente_id)
         where (p.urun_kod = purun_kod or purun_kod is null)
         and(p.police_no = ppolice_no or ppolice_no is null)

      select urun_kod,
             acente_kod,
             brut_prim
        from policeler
        left join police_musteri pm_sg
          on pm_sg.police_hareket_id = ph_police_hareket_id
         and pm_sg.rol_id = pck_const_rol.sigortali
         and pm_sg.sira_no = 1
        left join musteri m_sg
          on (m_sg.musteri_id = pm_sg.musteri_id)
       order by police_id;
    return vret;
  end;

1 Ответ

1 голос
/ 12 мая 2019

Это как разделить строку значений через запятую на строки. Это пример SQL * Plus, просто чтобы показать, как он работает:

SQL> var purun_kod varchar2(100);
SQL> exec :purun_kod := '100,150,255,777';

PL/SQL procedure successfully completed.

SQL> select regexp_substr(:purun_kod, '[^,]+', 1, level) urun_kod
  2  from dual
  3  connect by level <= regexp_count(:purun_kod, ',') + 1;

URUN_KOD
----------------------------------------------------------------------
100
150
255
777

SQL>

В настоящее время размещенный вами код не имеет особого смысла, поскольку вы никогда не используете v_urun_kod. Поскольку функция возвращает ref курсора, нет смысла запускать этот код для каждого отдельного значения; Вы могли бы делать это в цикле, но это не сработало бы так, как вы бы этого хотели (по крайней мере, я так думаю).

Глядя на это, я думаю, что-то подобное может сделать то, что вы ищете:

SQL> create or replace
  2  function police_ara( purun_kod       in varchar2,
  3                       ppolice_no      in varchar2)
  4  return sys_refcursor is
  5    vret          sys_refcursor;
  6    -- v_urun_kod varchar(1000);   --> no need for that variable any more
  7  begin
  8    open vret for
  9      with policeler as
 10        (select distinct ph.police_hareket_id ph_police_hareket_id,
 11                         p.urun_kod,
 12                         (select max(pho.police_hareket_id)
 13                          from police_hareket_otr pho
 14                          where pho.police_hareket_id = ph.police_hareket_id
 15                            and (   pho.durum_kod1 = 0
 16                                 or pho.durum_kod2 = 0
 17                                 or pho.durum_kod3 = 0
 18                                 or pho.durum_kod4 = 0
 19                                )
 20                         ) pho_police_hareket_id,
 21                         --
 22                         ph.odeme_arac_kod,
 23                         ph.police_id
 24           from police p
 25           --> this is new
 26           join (select regexp_substr(purun_kod, '[^,]+', 1, level) urun_kod
 27                 from dual
 28                 connect by level <= regexp_count(purun_kod, ',') + 1
 29                ) x on x.urun_kod = p.urun_kod
 30           --> end of "this is new"
 31           inner join police_hareket ph on 1 = 1 --> you're missing join condition here
 32             and (   ph.ekbelge_no > 0
 33                  or (select count(1)
 34                      from police_kotasyon pk
 35                      where pk.police_hareket_id = ph.police_hareket_id
 36                        and pk.kotasyon_seviyesi = 3
 37                        and rownum = 1
 38                     ) > 0
 39                 )
 40            left join police_prim pp
 41              on (    pp.police_hareket_id = ph.police_hareket_id
 42                  and pp.para_birim_kod = ph.para_birim_kod
 43                 )
 44            left join musteri_rol mr
 45              on (mr.musteri_rol_id = pa.acente_id)
 46           where (   p.urun_kod = purun_kod
 47                  or purun_kod is null
 48                 )
 49             and (   p.police_no = ppolice_no
 50                  or ppolice_no is null
 51                 )
 52        )
 53        select urun_kod,
 54               acente_kod,
 55               brut_prim
 56          from policeler
 57          left join police_musteri pm_sg
 58            on pm_sg.police_hareket_id = ph_police_hareket_id
 59           and pm_sg.rol_id = pck_const_rol.sigortali
 60           and pm_sg.sira_no = 1
 61          left join musteri m_sg
 62            on (m_sg.musteri_id = pm_sg.musteri_id)
 63         order by police_id;
 64    return vret;
 65  end;
 66  /

Warning: Function created with compilation errors.

Обратите внимание на следующее:

  • строка 6: переменная v_urun_kod больше не нужна
  • строки 25-30: это новый фрагмент кода, который использует приведенный выше пример. Это SELECT используется как встроенное представление и соединяется со столбцом police таблицы urun_kod (по крайней мере, я думаю, что вы должны это сделать)
  • строка 31: здесь вы пропускаете предложение ON; исправить это самостоятельно, я не знаю, что это должно быть
  • функция создана с ошибками компиляции, так как у меня нет ваших таблиц; кроме этого, может быть в порядке:

    SQL> show err
    Errors for FUNCTION POLICE_ARA:
    
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    8/5      PL/SQL: SQL Statement ignored
    43/21    PL/SQL: ORA-00942: table or view does not exist
    SQL>
    
...