sql >> データベース >  >> RDS >> Oracle

次のエラー LISTAGG 関数が表示されるのはなぜですか:「文字列連結の結果が長すぎますか?*

    他のコメンテーターがすでに述べたように、Oracle 12.2 (List_agg に新しいオプション "ON OVERFLOW TRUNCATE" が追加される) まで、このようなエラーを回避する方法はありません。

    Oracle の以前のバージョンでは、4000 バイトを超える文字列を連結すると、そのエラーが発生します。それを防ぐ方法はありません。

    以前のバージョンでそれを行う必要がある場合は、それを行うための独自の関数を記述し、それに応じてクエリを変更する必要があります:

    このカスタム関数で問題が解決するかもしれません

     create or replace type TAB_STRINGS is table of varchar2(4000) / create or replace function My_list_agg(TAB_STRINGS の文字列、varchar2 の区切り文字、max_len 整数) return varchar2 deterministic is result varchar2(32000); tmp varchar2(32000);結果を開始します:=null;文字列が null でない場合は、strings.first .. 文字列の idx に対して。最後のループ tmp :=文字列 (idx); tmp が null でない場合、結果が null の場合、length(tmp)> max_len のときに終了します。結果:=tmp;そうでなければ終了します when(length(result) + length(separator) + length(tmp))> max_len;結果 :=結果 || || セパレーター || tmp;終了する場合;終了する場合;ループを終了します。終了する場合;結果を返します。終わり; //  

    これを使用するには、CAST/COLLECT 演算子を使用する必要があります。
    これは使用例です:

     select table_name, My_list_agg( -- 最初の引数:連結キャストされる文字列の配列 (collect (column_name order by column_name) as TAB_STRINGS), -- 2 番目の (オプション) 引数:セパレータ ',', - - 3 番目の引数 (オプション):返される文字列の最大長 1000 ) as column_list from user_tab_columns t group by table_name order by table_name  


    1. データベースからデータを取得し、データが到着したときに停止するタイムリーな間隔

    2. エラー:ユーザーのID認証に失敗しました

    3. SQL INSERT構文–DBMSによってリストされます

    4. ストップワードリストが空であってもストップワードが含まれている場合、全文検索は機能しません