1

何が原因なのかわからないという別の問題があります。私はOracleを初めて使用し、2つの文字列を連結することに取り組んでいます。DateStart、DateStop、およびその他の変数を取得して、それらをSQLstmtに変換する関数があります。関数は正常にコンパイルされていましたが、実行時に次のエラーが発生します。

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

最初は、文字列の1つに引用符がないのではないかと思いましたが、1つを印刷したときに関数がエラーを生成しなかったため、両方の文字列は問題ありません。両方を組み合わせた場合にのみ問題が発生しました。見落としているのは明らかかもしれませんが、演算子「||」の代わりにconcatを試しましたが、問題の原因を特定できませんでした。誰かが以前にこの問題に遭遇したことがあるなら、私が間違っていたことのヒントを教えていただければ幸いです。

これが問題の原因となった関数です。問題をゼロにできるように、他のすべての無関係なコードを削除しました。関数は正しくコンパイルされましたが、実行時に問題がありました。

ありがとう!

create or replace
FUNCTION ABC(
    DateStart IN VARCHAR2 ,
    DateStop  IN VARCHAR2 ,
    ZipCode   IN VARCHAR2 ,
    PracticeID IN VARCHAR2)
    RETURN VARCHAR2
IS
  v_code  NUMBER;
  v_errm  VARCHAR2(64);
  sqlstmt VARCHAR2(1000);
  sqlstmt2 VARCHAR2(500);
  sConditionClause VARCHAR2(500);
  s_Quote VARCHAR(1) := chr(39);
BEGIN
  sqlstmt2 :='SELECT TO_CHAR("Date", ''yyyy-mm-dd'') AS "Date" ,            
               substr(trim("Postal"),1,5) AS "ZipCode" ,                         
               count ("Patient") AS "Total" ';
  sConditionClause := ' FROM "ABC_TABLE"  WHERE "Date">=To_Date('
                      ||s_Quote || trim(DateStart) ||s_Quote
                      ||','
                      ||s_Quote||'mm/dd/yyyy'||s_Quote||')AND "Date"<=To_Date('
                      ||s_Quote || trim(DateStop) ||s_Quote
                      ||','||s_Quote||'mm/dd/yyyy'||s_Quote||') ';  
  sqlstmt := trim(sqlstmt2)||trim(sConditionClause);

  RETURN sqlstmt;
END;
4

2 に答える 2

0

変数の1つ(、、、sqlstmt2またはsConditionClausesqlstmtは、割り当てようとしている文字列に対して小さすぎます。エラーが発生している行番号を含めていれば、どちらの行番号かわかります。

ちなみに、2つの一重引用符を一緒に使用して、そのまま使用するのではなく、文字列に1つを追加することがs_Quoteできます。

ローカル変数をスキップすることで、この問題を完全に回避できます。

create or replace
FUNCTION ABC(
    DateStart IN VARCHAR2,
    DateStop  IN VARCHAR2)
    RETURN VARCHAR2
IS
BEGIN      
  RETURN 'SELECT TO_CHAR("Date", ''yyyy-mm-dd'') AS "Date" ,            
           substr(trim("Postal"),1,5) AS "ZipCode" ,                         
           count ("Patient") AS "Total" 
           FROM "ABC_TABLE"  WHERE "Date">=To_Date(''' 
           || trim(DateStart) 
           ||''',''mm/dd/yyyy'') AND "Date"<=To_Date('''
           || trim(DateStop) 
           ||''',''mm/dd/yyyy'')';
END ABC;
于 2012-04-13T13:56:06.030 に答える
0

これが私が見つけたものです。上記の関数には問題がない可能性があり、連結は問題ありませんでした。この問題は、SQLDeveloperが提供する単体テストRunPL/SQLに起因していました。デフォルトでは、200文字の長さの戻り値文字列?!。私はSQLDeveloperに精通していないため、SQL Developerを発見し、自分の機能を非難しました。戻り文字列の長さをvarchar2(5000)に変更するとすぐに、すべてが魅力のように実行されます

于 2014-06-04T19:23:56.100 に答える