2

PL/SQL 変数の宣言では、varchar2のような型の長さを設定する必要があります。

declare
  query varchar2(2000);
begin
  for i in 1..100 loop
    query := query || to_char(i);
  end loop;
  dbms_output.put_line(query);
end;
/

製品要件が変更されてループ範囲が大きくなり (私の例では範囲を1..1000に設定)、エラーが発生したときにトラップが実行されました。

ORA-06502: PL/SQL: : буфер символьных строк слишком маленький ошибка числа или значения ORA-06512: на  line 5

したがって、どこでもクエリの長​​さを増やす必要があり、将来を述語するためにさらに大きな数を使用する必要があります。

これは醜いです。私は PL/SQL の専門家ではありませんが、公式ドキュメントを読むことで、長さを必要としないclob型を見つけ、簡単なチェックでコードが機能することがわかりました!

PL/SQL コードは、Pascal のようではなくなり、Python/Ruby/Perl のようになります。私は本当にそれが好き。

集中的にループを使用しない、動的に構築された文字列に対してのみ型変換を適用します。

そのようなテクニックは正しいですか、それとも間違っていますか?

PS私はPL / SQLプログラミングの初心者なので、そのようなばかげた質問をしてください...

PPS作業コードの 1 つ (簡略化):

queryStr := 'create or replace view "DATA_VIEW" ("DT", "MONEY", "EVENT") as ( ';
for eventRec in eventCur
loop
  queryStr := queryStr || 'select DT, MONEY, ' || eventRec.ID
    || ' EVENT from ' || eventRec.tbl || ' union ';
end loop;
queryStr := rtrim(queryStr, ' union ') || ')';
execute immediate queryStr;
commit;
4

2 に答える 2

5

CLOBSQL で 4000 バイト、PL/SQL で 32 kB を超える文字列を操作する場合は、データ型が唯一の現実的なオプションです。

ただし、小さな文字列に対するon の操作は onCLOBよりも少しコストがかかるため、大きな文字列を扱う場合にのみデータ型を使用する必要があります。したがって、データ型にはまだ用途があります。船外に出て、すべての文字列を CLOB に置き換えないでください。VARCHAR2CLOBVARCHAR2

于 2013-07-01T15:35:29.750 に答える