2

私はOracle Apex 4.2で作業しています。私は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 に関する情報のみを保持するため、2 つの列の連結値 (名前 ||' - '||site ) を別のテーブルで検索する必要があることです。

非常に単純ですが、もう 1 つのカーブ ボールがあります。location_id はシャトルの結果を保持するため、34:45:56:67 のような値が入力されます。それを次のように変換する必要があります。

オーランド - SITE1、アリゾナ - SITE2、マイアミ - SITE3

したがって、これらすべての結果がレポートの 1 つの行に返されます

これはレポートであるため、列レポートを「LOVに基づいてテキストとして表示」に転送し、SQLステートメントを生成して値をループするPL/SQLブロックを構築するなどして行うことができます。

私は多くのアプローチを試しましたが、アイデアが不足しており、この問題を解決する時間がありません。どんな助けでも大歓迎です。

4

3 に答える 3

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 を持つ 3 番目のテーブルを作成します。次に、クエリでこのテーブルを結合するだけです。しかし、私は理解していませんでした:

それを次のように変換する必要があります。

オーランド - SITE1、アリゾナ - SITE2、マイアミ - SITE3

したがって、これらすべての結果がレポートの 1 つの行に返されます

本当の要件ですか?に変換するとどうなるか

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

? その場合、単純な結合が 1 つ必要になります。または、結合せずにレポートを作成し、1 つのフィールドを別のテーブルからのルックアップとして作成します。

于 2013-07-11T07:14:47.733 に答える