2013-10-09 1 views
1

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; 
+0

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 ... –

+0

Non, je ne veux pas faire cela, mais je vois maintenant où le problème est créé. Merci pour l'aide. – olovholm

Répondre

3

À la ligne 11 de la fonction safe_to_number que vous appelez la fonction récursive safe_to_number lui-même.

Cette ligne:

retval := safe_to_number(p); 

devrait probablement:

retval := to_number(p); 
+0

Merci, je peux voir pourquoi cela a causé un problème. – olovholm

Questions connexes