oracle - 如何在plsql中拆分参数
问题描述
嗨,伙计们,我如何在 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;
解决方案
这是如何将逗号分隔值字符串拆分为行。这是一个 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>
推荐阅读
- intellij-idea - 在 IDEA 中格式化 tsx 文件
- python - 无法打开 .tif 图像
- java - 在循环中在 RxJava 中的变量延迟之前和之后执行函数
- mysql - 日期差异在mysql中产生错误的输出
- python - 翻转二维 numpy 数组行中的两个值
- javascript - 缩放隐藏系列的最后一点
- r - 是否有 R 函数可以帮助我创建 5 个同样平衡的单词列表?
- c# - 如何在 Microsoft Bot Framework 中组织多个 ActivityHandler 类
- javascript - 将数字更改为相应的字母
- c# - LINQ 查询速度问题使用 .Any