首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle存储过程中的内部查询

Oracle存储过程中的内部查询
EN

Stack Overflow用户
提问于 2015-08-25 22:19:28
回答 2查看 163关注 0票数 0

正在尝试编写存储过程。我在存储过程中有一个游标,它会产生以下输出。

代码语言:javascript
复制
 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的范围。

代码语言:javascript
复制
 ID | UPCName
--------------
 1  | Test
 2  | Test1
 3  | Test2
 10 | Test10
...

现在,我需要查询包含范围列的UPCListDetails表,并生成输出

代码语言:javascript
复制
 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集合的文章,但我不能理解它。

EN

回答 2

Stack Overflow用户

发布于 2015-08-25 22:29:37

最好是使用2列,每个范围一行来维护范围:

代码语言:javascript
复制
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

然后您只需要一个查询,如

代码语言:javascript
复制
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;

这样,您就不必解析范围和范围列表。

票数 0
EN

Stack Overflow用户

发布于 2015-08-25 23:04:06

如果您能够更改过程中的游标,使其以@TonyAndrews的解决方案建议的格式输出数据,那么我建议您这样做。

但是,如果您坚持使用游标输出,则需要完成将其转换为该格式工作:

代码语言:javascript
复制
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表中就可以得到最终的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32206536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档