正在尝试编写存储过程。我在存储过程中有一个游标,它会产生以下输出。
ID1 | Range | Action | Version | Name
--------------------------------------
1 | 1-3, | | |
| 5-7 | D | V0 | U1
2 | 10-11 | A | V0 | U2
3 | 15-18 | A | V1 | U3其中ID是另一个表UPCListDetails的范围。
ID | UPCName
--------------
1 | Test
2 | Test1
3 | Test2
10 | Test10
...现在,我需要查询包含范围列的UPCListDetails表,并生成输出
ID1 | ID | UPCName | Action | Version | Name
----------------------------------------------
1 | 1 | Test | D | V0 | U1
1 | 2 | Test1 | D | V0 | U1
1 | 3 | Test2 | D | V0 | U1
2 | 10 | Test10 | A | V1 | U2基本上,我需要用range (来自range列的低值和高值)查询UPCListDetails表,并将其存储在某个变量中,然后将该值再次注入到结果中。我正在读关于PLSQL集合的文章,但我不能理解它。
发布于 2015-08-25 22:29:37
最好是使用2列,每个范围一行来维护范围:
ID1 Range_From Range_To Action Version Name
1 1 3 D V0 U1
2 5 7 D V0 U1
3 10 11 A V0 U2
4 15 18 A V1 U3然后您只需要一个查询,如
select u.ID, u.UPCName, r.Action r.Version r.Name
from UPCListDetails u
join range_table r
on u.ID between r.range_from and r.range_to;这样,您就不必解析范围和范围列表。
发布于 2015-08-25 23:04:06
如果您能够更改过程中的游标,使其以@TonyAndrews的解决方案建议的格式输出数据,那么我建议您这样做。
但是,如果您坚持使用游标输出,则需要完成将其转换为该格式工作:
with output as (select 1 id1, '1-3, 5-7' range, 'D' action, 'V0' version, 'U1' name from dual union all
select 2 id1, '10-11' range, 'A' action, 'V0' version, 'U2' name from dual union all
select 3 id1, '15-18' range, 'A' action, 'V1' version, 'U3' name from dual),
main_op as (select id1,
regexp_substr(regexp_substr(replace(range, ' '), '[^,]+', 1, level), '[^-]+', 1, 1) range_from,
regexp_substr(regexp_substr(replace(range, ' '), '[^,]+', 1, level), '[^-]+', 1, 2) range_to,
action,
version,
name
from output
connect by prior id1 = id1
and level <= regexp_count(range, ',') + 1
and prior dbms_random.value is not null),
upclistdetails as (select 1 id, 'Test' upcname from dual union all
select 2 id, 'Test1' upcname from dual union all
select 3 id, 'Test2' upcname from dual union all
select 10 id, 'Test10' upcname from dual)
select mo.id1,
uld.id,
uld.upcname,
mo.action,
mo.version,
mo.name
from upclistdetails uld
inner join main_op mo on uld.id between mo.range_from and mo.range_to;
ID1 ID UPCNAME ACTION VERSION NAME
---------- ---------- ------- ------ ------- ----
1 1 Test D V0 U1
1 2 Test1 D V0 U1
1 3 Test2 D V0 U1
2 10 Test10 A V0 U2 main_op子查询的作用是首先为每个id1生成与范围块一样多的行(例如,对于id1 = 1,有2个范围块),每个块在自己的行上输出。
然后,我们将连字符前面的元素用作"range_from“列,类似地,我们将连字符后面的元素用作"range_to”。
一旦你有了这样的输出,只需将它连接到upclistdetails表中就可以得到最终的结果。
https://stackoverflow.com/questions/32206536
复制相似问题