1

一部の pgpl/SQL を psql oracle 関数に移行しようとすると、まったく説明できない奇妙な動作を発見しました。

ここに私の機能があります:

CREATE OR REPLACE FUNCTION small_distinct(
   tableName IN varchar, 
   cols IN COL_ARRAY,     
   whereCond IN varchar
)
RETURN varchar 
IS
  nbcols PLS_INTEGER;
  currentcolnumber PLS_INTEGER;
  currentcol varchar(100);
  firstcol varchar(100);
  sqlpart varchar(4000);
  firstquery_str VARCHAR2(4000);
  query_str VARCHAR2(4000);
  big_query_str VARCHAR2(10000);
  firstresult varchar(100);
  opt SYS_REFCURSOR;
BEGIN
  firstcol:= cols(1);
  sqlpart := firstcol;
  nbcols := cols.COUNT;
  currentcolnumber :=  2;
  big_query_str := 'SELECT * from ( SELECT '|| sqlpart ||' FROM '||tableName||' WHERE ' ||    whereCond|| ' ORDER BY '|| firstcol || ') WHERE ROWNUM = 1';

  while currentcolnumber <= nbcols loop
     sqlpart := sqlpart || ', ' ||cols(currentcolnumber);
     currentcolnumber := currentcolnumber +1;
  end loop;

  EXECUTE IMMEDIATE 'SELECT * from (SELECT '|| firstcol ||' FROM '||tableName ||' WHERE ' || whereCond|| ' ORDER BY '|| firstcol || ') WHERE ROWNUM = 1 ' INTO firstresult;

  while firstresult is not null 
  loop
    big_query_str := big_query_str || ' UNION ' || 'SELECT * from ( SELECT '|| sqlpart ||' FROM '||tableName||' WHERE '|| firstcol ||' > '''|| firstresult||''' AND ' || whereCond|| ' ORDER BY '|| firstcol || ') WHERE ROWNUM  = 1  ';
    EXECUTE IMMEDIATE 'SELECT * from ( SELECT ' || firstcol ||' FROM '||tableName ||' WHERE '|| firstcol ||' > '''|| firstresult||''' AND '|| whereCond|| ' ORDER BY '|| firstcol || ') WHERE ROWNUM = 1' INTO firstresult;
  end loop;

  return big_query_str;
END small_distinct; 

この関数はうまくコンパイルされますが、関数が戻ると varcharbig_query_strが null になります。

私の関数でわかるように、18行varchar目の値で初期化するため、これがnullになる可能性はありません

問題が何であるかを発見するために行を削除しようとしましたが、whileループを削除した場合にのみ戻り値はnullではありません(行24付近)

PL/SQL で varchar をリセットできるイベントの種類を少なくとも誰かが説明してくれますか?

4

3 に答える 3

0

これについてはよくわかりませんが、big_query_str は長さ 10,000 の varchar2 として定義されています。SQL に戻るときの varchar2 の最大許容長は 4000 文字です。それで、おそらく、それは問題ですか?big_query_str を CLOB 型に定義し、それを関数から返すことはできますか (関数に必要な変更を加えた後)

于 2013-07-22T13:40:10.850 に答える