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構造を移動することはできません。
これでイベントレコードとして