Oracle関数:wm_concatを複製します
-
21-09-2019 - |
質問
私は現在、Crystal Reports内のプロジェクトに取り組んでおり、Oracle 10g内で許容される文書化されていない関数WM_CONCATの使用を拒否しています。これがWM_CONCATヘッダー情報です
WM_CONCAT(p1 IN VARCHAR2) RETURN VARCHAR2
WM_CONCATを使用するには、次のことを渡します。WM_CONCAT(column1);この関数は、varchar2の型の列を受け入れているようで、列から値のコンマ区切りリストを返します。現在、この関数のカスタムバージョンが機能しています(ワークコンピューターで)がありますが、最適ではなく、再利用性がありません。誰でも、私が使用できるWM_CONCATのような優れた再利用可能な機能を提供できますか?
解決
wm_concatを使用するときにエラーメッセージが表示されますか? TO_CHARのような関数とは異なり、WMSYSが所有しており、WMSYS.WM_CONCATを使用して使用する必要がある場合があります。 (もちろん、必要な同義語を作成しない限り)。
さて、実際の質問のために、
この手法は、文字列集約と呼ばれます。
ここでは、他の多くの選択肢を見つけることができます。
http://www.oracle-base.com/articles/10g/stringaggregationtechniques.php他の方法については、「Stragg」を検索します http://asktom.oracle.com別の便利なリンク: http://www.orafaq.com/node/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と数で機能しますが、最適なジェネリックソリューションは、Oracle odciaggregateインターフェイスを使用して構築できます。
http://download-west.oracle.com/docs/cd/b14117_01/appdev.101/b10800/dciaggfns.htm#sthref462
同じものの実装は、上記の最初のリンクwww.oracle-base.comにあります。
他のヒント
Oracle-Baseの記事の最後のテクニックと同様の手法を使用して、これを解決しました。 TABLE
タイプの値を文字列に集約するための関数を入力して書き込みます。私は自分の機能を呼びました joinstr
そして、あなたはそれを次のように呼ぶことができます:
SELECT joinstr(CAST(MULTISET(SELECT column1 FROM table1) AS my_string_table_type), ',')
FROM DUAL
注:私は最近まで9iにいましたが、まだ収集を検討していません。