j'ai écrit deux fonctions pour convertir le type de données dans Oracle, et a appelé ceux-ci dans une instruction select sur une grande table comme ceci:fonctions PL/SQL conduit à « plus de données à lire l'erreur de socket »
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;
après que la base de données a fonctionné pendant un certain temps, j'ai eu un "plus de données à lire de l'erreur de douille", et j'ai besoin de redémarrer le développeur Oracle SQL pour accéder à nouveau à la base de données.
Pourquoi cette erreur se produit-elle, et existe-t-il un moyen d'écrire des fonctions PL/SQL pour éviter cette erreur?
Les fonctions que je l'ai mis en œuvre sont:
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;
et
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;
Voulez-vous dire vraiment 'safe_to_number()' à s'appeler récursive, pour toujours? Ou est-ce censé appeler 'to_number()'? Si c'est ce que vous avez vraiment, je suppose que le serveur DB est en train de tuer votre session parce qu'il manque de ressources ... –
Non, je ne veux pas faire cela, mais je vois maintenant où le problème est créé. Merci pour l'aide. – olovholm