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

文字列を連結する方法は?

    だから、エラーはORA-06502だと思います この状況では、これは当てはまらないと思われるかもしれません。

    ただし、これはwm_concatのせいです 。これは関数であり、PL\SQLでのOracleの最大varchar長である32,767および標準SQLでの4,000によって制約されます。残念ながら、wm_concatの動作方法、関数内の下限制約、またはselectで使用しているため、上限に近づくことはできないと思います。

    別のオプション、straggがあります 、TomKyteの文字列集計関数。次の2つの比較を見ると、パフォーマンスはほぼ同じであり、両方の制限は約4,000、つまり標準のSQLの最大値であることがわかります。 stragg おそらくキャッシュが原因で、わずかに高速になります。

    SQL> set serveroutput on
    SQL>
    SQL> create table tmp_test ( a varchar2(30) );
    
    Table created.
    
    SQL> insert into tmp_test
      2   select object_name
      3     from all_objects
      4          ;
    
    81219 rows created.
    
    SQL>  commit ;
    
    Commit complete.
    
    SQL>
    SQL> declare
      2
      3    i integer := 1;
      4    k number(10);
      5    v_stragg varchar2(32767);
      6    v_test varchar2(32767) := '';
      7    start_time timestamp;
      8
      9  begin
     10
     11    select count(*)
     12      into k
     13      from tmp_test;
     14
     15    for i in 1 .. k loop
     16      start_time := systimestamp;
     17      begin
     18
     19        select wm_concat(a) into v_test
     20          from tmp_test
     21         where rownum < i;
     22
     23      exception when others then
     24        dbms_output.put_line('wm_concat: ' || length(v_test));
     25        dbms_output.put_line(systimestamp - start_time);
     26        exit;
     27     end;
     28    end loop;
     29
     30    for i in 1 .. k loop
     31      start_time := systimestamp;
     32
     33      select stragg(a) into v_test
     34        from tmp_test
     35       where rownum < i;
     36
     37      if v_test = 'OVERFLOW' then
     38        dbms_output.put_line('stragg: ' || length(v_stragg));
     39        dbms_output.put_line(systimestamp - start_time);
     40        exit;
     41      else v_stragg := v_test;
     42      end if;
     43    end loop;
     44  end;
     45  /
    wm_concat: 3976
    +000000000 00:00:00.005886000
    stragg: 3976
    +000000000 00:00:00.005707000
    
    PL/SQL procedure successfully completed.
    

    それを解決することに関しては、私はあなたができないのではないかと思います。その限界に達したら、それだけです。集計を行う別の方法を見つけるか、本当にかどうかを自問する必要があります。 する必要があります。




    1. onUpgradeメソッドが呼び出されたことはありますか?

    2. SQLの制約

    3. グループ内の最後の行をクエリで検索-SQLServer

    4. DESCRIBEコマンドを使用せずにOracleでテーブルを記述するにはどうすればよいですか?