Oracle 如何在plsql中拆分参数
大家好,我如何在plsql中拆分参数purun_kod像100150255777,我想拆分它并分配给v_urun_kod 谢谢你的帮助。 我的代码有点像:Oracle 如何在plsql中拆分参数,oracle,plsql,split,Oracle,Plsql,Split,大家好,我如何在plsql中拆分参数purun_kod像100150255777,我想拆分它并分配给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_
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;
这是如何将逗号分隔的值字符串拆分为行。这是一个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>
注意以下几点:
第6行:不再需要v_urun_kod变量
第25-30行:这是一段新代码,它利用了上面发布的示例。该SELECT用作内联视图,并与police表的urun_kod列连接,至少我认为您应该这样做
第31行:此处缺少ON子句;你自己修吧,我不知道该怎么办
函数创建时有编译错误,因为我没有您的表;除此之外,还可以:
感谢您的重播,但欢迎您从dual connect逐层加入select regexp_substrpurun_kod,[^,]+',1,level urun_kod。不幸的是,我不明白你想说什么。我发布的代码将逗号分隔的值拆分为行。以后你会怎么处理它,这取决于你。我试着写了一些代码,我认为这可能是你正在寻找的。如果不是,请尽可能使用它
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.
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>