4

私は現在、Crystal Reports 内のプロジェクトに取り組んでいます。このプロジェクトでは、Oracle 10g 内で許可されている文書化されていない関数 WM_CONCAT の使用を拒否しています。WM_CONCAT ヘッダー情報は次のとおりです。

WM_CONCAT(p1 IN VARCHAR2) RETURN VARCHAR2

WM_CONCAT を使用するには、次のように渡します。この関数は varchar2 型の列を受け入れるようで、列からカンマ区切りの値のリストを返します。現在、この機能のカスタム バージョンを (私の仕事用コンピューターで) 使用していますが、最適ではなく、再利用性に欠けています。私が使用できる WM_CONCAT のような再利用可能な優れた関数を誰かが提供できますか?

4

2 に答える 2

8

wm_concat を使用するとエラー メッセージが表示されますか? to_char のような関数とは異なり、これは wmsys によって所有されており、使用するには wmsys.wm_concat を使用する必要がある場合があります。(もちろん、必要な同義語を作成しない限り)。

さて、実際の質問ですが、

この手法は文字列集約と呼ばれます。

ここでは、他の多くの代替手段を見つけることができます。

http://www.oracle-base.com/articles/10g/StringAggregationTechniques.php 他の方法については、http://asktom.oracle.com で「stragg」を検索してください。 別の便利なリンク: http://www.orafaq.コム/ノード/2290

これはおそらく最も使用されているものです。多くのチームは、多かれ少なかれ同じことを行う独自のカスタム関数を作成します。

CREATE OR REPLACE FUNCTION get_employees (p_deptno  in  emp.deptno%TYPE)
  RETURN VARCHAR2
IS
  l_text  VARCHAR2(32767) := NULL;
BEGIN
  FOR cur_rec IN (SELECT ename FROM emp WHERE deptno = p_deptno) LOOP
    l_text := l_text || ',' || cur_rec.ename;
  END LOOP;
  RETURN LTRIM(l_text, ',');
END;
/
SHOW ERRORS

このソリューションは varchar2 と number に対して機能しますが、最適な汎用ソリューションは Oracle ODCIAggregate インターフェイスを使用して構築できます。

http://download-west.oracle.com/docs/cd/B14117_01/appdev.101/b10800/dciaggfns.htm#sthref462

同じ実装は、www.oracle-base.com の上記の最初のリンクにあります。

于 2009-12-28T03:30:18.700 に答える
1

私は oracle-base の記事の最後のものと同様の手法を使用してこれを解決しました: カスタムTABLE型を定義し、その型の値を文字列に集約する関数を記述します。関数joinstrを呼び出した後、次のように呼び出すことができます。

SELECT joinstr(CAST(MULTISET(SELECT column1 FROM table1) AS my_string_table_type), ',') 
FROM DUAL

注: 私は最近まで 9i を使用していましたが、COLLECT についてはまだ調べていません。

于 2009-12-28T20:28:35.810 に答える