1

Oracle でデータ型を変換する 2 つの関数を作成し、次のような巨大なテーブルの select ステートメントでこれらを呼び出しました。

SELECT
safe_to_number(sid_day) sid_day, 
safe_to_number(albumid) album_id,
safe_to_number(sid_album) sid_album,
safe_to_number(sid_artist) sid_artist,
safe_to_number(sid_channel) sid_channel 
FROM big_table_with_data; 

データベースがしばらく実行された後、「ソケットから読み取るデータがこれ以上ありません」というエラーが発生しました。データベースに再度アクセスするには、Oracle SQL 開発者を再起動する必要があります。

このエラーが発生する理由と、このエラーを回避する PL/SQL 関数を作成する方法はありますか?

私が実装した機能は次のとおりです。

CREATE OR REPLACE FUNCTION
safe_to_number (p varchar2)
RETURN number
IS
retval number;

BEGIN
  IF p IS NULL THEN
   retval := null;
  ELSE
    retval := safe_to_number(p);
  END IF;
  return retval;

EXCEPTION
WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Could not change value to number');
    retval := null;
    return retval;

END;

create or replace function is_a_timestamp
    ( p_str in varchar2
      , p_mask in varchar2)
    return timestamp
is
    d date;
begin
    d := to_timestamp(p_str, p_mask);
    return d;
exception
    when others then
    DBMS_OUTPUT.PUT_LINE('Could not change value to timestamp');
    return null;
end;
4

1 に答える 1

3

関数の 11 行目で、関数自体safe_to_numberを再帰的に呼び出しています。safe_to_number

この行:

retval := safe_to_number(p);

おそらく次のようになります。

retval := to_number(p);
于 2013-10-09T13:36:48.450 に答える