wm_concatの代替オーラル関数



Alternative Oralce Function Wm_concat



パーソナルテクノロジーのウェブサイト ようこそ注意

元のリンク: https://blog.csdn.net/m0_37548754/article/details/78553037



wm_concat oracle文字列連結関数は一般的に使用される関数ですが、この関数は公式のoracleでは推奨されていません。以降の更新でのoracle推定は、wm_concat oracle 11gを使用する前にサイレントに削除されますが、文字列を連結すると3,000を超えるエラーが発生します。

Oracle ORA-06502:PL / SQL:数値またはエラー:このエラー文字列バッファが小さすぎます



解決:

公式の推奨事項は、同じ変換を達成するための機能を独自のランクに設定します

以下の実装の最初のステップ:



CREATE OR REPLACE TYPE zh_concat_im

AUTHID CURRENT_USER AS OBJECT

(

CURR_STR clob,

STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT zh_concat_im) RETURN NUMBER,

MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT zh_concat_im,

P1 IN VARCHAR2) RETURN NUMBER,

MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN zh_concat_im,

RETURNVALUE OUT clob,

FLAGS IN NUMBER)

RETURN NUMBER,

MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT zh_concat_im,

SCTX2 IN zh_concat_im) RETURN NUMBER

)

The second step to perform:

CREATE OR REPLACE TYPE BODY zh_concat_im

IS

STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT zh_concat_im)

RETURN NUMBER

IS

BEGIN

SCTX := zh_concat_im(NULL)

RETURN ODCICONST.SUCCESS

END

MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT zh_concat_im,

P1 IN VARCHAR2)

RETURN NUMBER

IS

BEGIN

IF(CURR_STR IS NOT NULL) THEN

CURR_STR := CURR_STR || ',' || P1

ELSE

CURR_STR := P1

END IF

RETURN ODCICONST.SUCCESS

END

MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN zh_concat_im,

RETURNVALUE OUT clob,

FLAGS IN NUMBER)

RETURN NUMBER

IS

BEGIN

RETURNVALUE := CURR_STR

RETURN ODCICONST.SUCCESS

END

MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT zh_concat_im,

SCTX2 IN zh_concat_im)

RETURN NUMBER

IS

BEGIN

IF(SCTX2.CURR_STR IS NOT NULL) THEN

SELF.CURR_STR := SELF.CURR_STR || ',' || SCTX2.CURR_STR

END IF

RETURN ODCICONST.SUCCESS

END

END

Finally, execute:

create or replace FUNCTION zh_concat(P1 VARCHAR2)

RETURN clob AGGREGATE USING zh_concat_im

実際の使用例:参考用です。

Zh_concatはwm_concat関数を直接置き換えますが、元のSQL構造を移動することはできません。

これでイベントレコードとして