一部の 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 をリセットできるイベントの種類を少なくとも誰かが説明してくれますか?