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;