2

我正在使用 Oracle Apex 4.2。我有两张桌子:

我有简单的报告要建立

select id, name, location_id from tablel1
 -----------------------------------
| ID   |  NAME   |  PROJECT_ID    |
-----------------------------------
|  1   |   P1    | 23:45:56       |
|  2   |   P2    |    23          |
|  3   |   P3    |    45:65       |
-----------------------------------

------------------------------------------
| ID   |  NAME        |  SITE            |
------------------------------------------
|  23  |   Orlando    |    SITE1         |
|  45  |   Arizona    |    SITE2         |
|  65  |   Maimi      |    SITE3         |
------------------------------------------

但是我遇到的问题是 location_id 仅包含有关 id 的信息,因此它需要查找不同的表以获取两列的 concat 值(名称 ||' - '||site )。

这很简单,但是还有另一个曲线球:location_id 保存了穿梭的结果,因此它由像 34:45:56:67 这样的值填充。我需要将其转换为:

奥兰多 - SITE1,亚利桑那 - SITE2,迈阿密 - SITE3

所以所有这些结果都会在报告的一行中返回

由于这是报告,它可以通过以下方式完成:将列报告转换为“基于 LOV 显示为文本”,构建 PL/SQL 块,生成 SQL 语句并循环遍历值......等。

我尝试了很多方法,但我的想法和时间都用完了来解决这个问题。非常感谢任何帮助。

4

3 回答 3

2

仅使用 SQL(Oracle 11g):

  select x.id, x.name, listagg(t2.name || t2.site, ', ') within group (order by t2.id)
  from 
  (
    select distinct t1.id, t1.name, regexp_substr(t1.project_id, '[^:]+', 1, level) id_site
    from tablel1 t1
    connect by level <= regexp_count(t1.project_id, ':') + 1
  ) x, table22 t2
  where t2.id = x.id_site
  group by x.id, x.name

这给出了:

1   P1  Orlando - SITE1, Arizona - SITE2, Miami - SITE3
2   P2  Orlando - SITE1
3   P3  Arizona - SITE2, Miami - SITE3
于 2013-07-09T16:24:23.537 回答
1

这是程序:

DECLARE
  CURSOR c (p_id  NUMBER) IS
    SELECT NAME||' - '||SITE
      FROM TABLE2
     WHERE ID = p_id;
  l_tsv     VARCHAR2(1000) := '23:45:56';
  l_item    NUMBER;
  lc_t      VARCHAR(200);
  lc_result VARCHAR2(4000);
BEGIN
  FOR i IN 1 .. LENGTH(l_tsv) - LENGTH(REPLACE(l_tsv, ':', '')) + 1 LOOP
    l_item := REGEXP_SUBSTR(l_tsv, '[^:]+', 1, i);
    OPEN c (l_item);
    FETCH c INTO lc_t;
    CLOSE c;
    lc_result := lc_result ||', '||lc_t;
  END LOOP;
  lc_result := SUBSTR(lc_result,3);
  dbms_output.put_line(lc_result); 
END;

更新

功能:

CREATE OR REPLACE FUNCTION some_name(l_tsv VARCHAR2) RETURN VARCHAR2 IS
  CURSOR c (p_id  NUMBER) IS
    SELECT NAME||' - '||SITE
      FROM TABLE2
     WHERE ID = p_id;
  l_item    NUMBER;
  lc_t      VARCHAR(200);
  lc_result VARCHAR2(4000);
BEGIN
  FOR i IN 1 .. LENGTH(l_tsv) - LENGTH(REPLACE(l_tsv, ':', '')) + 1 LOOP
    l_item := REGEXP_SUBSTR(l_tsv, '[^:]+', 1, i);
    OPEN c (l_item);
    FETCH c INTO lc_t;
    CLOSE c;
    lc_result := lc_result ||', '||lc_t;
  END LOOP;
  lc_result := SUBSTR(lc_result,3);
  RETURN (lc_result);
END some_name;
于 2013-07-09T15:45:33.497 回答
0

正如您在评论中所说:使用 table1 和 location_id 的 ID 创建第三个表。然后只需在查询中加入这些表。但我并没有明白:

我需要将其转换为:

奥兰多 - SITE1,亚利桑那 - SITE2,迈阿密 - SITE3

所以所有这些结果都会在报告的一行中返回

是真正的要求吗?如果将其转换为

P1 - Orlando - SITE1
P1 - Arizona - SITE2 
P1 - Maimi   - SITE3
P2 - Orlando - SITE1
P3 - Arizona - SITE2 
P3 - Maimi   - SITE3

? 如果是这样,您将需要一个简单的连接。或者在没有连接的情况下制作报告,并且一个字段从另一个表中查找。

于 2013-07-11T07:14:47.733 回答