2010-03-04 12 views
2

Comment supprimer des lignes d'une table, où une colonne contient une sous-chaîne, mais le type de cette colonne est 'Long'. (Oui, je sais que je ne devrais pas utiliser Long, mais je maintiens le désordre de quelqu'un d'autre).Supprimer les lignes correspondant à la sous-chaîne avec LIKE?

Ma première tentative a été:

delete from longtable 
    where search_long(rowid) like '%hello%'; 

(suite de this answer.)

Ce retour:

SQL Error: ORA-04091: table blah.longtable is mutating, trigger/function may not see it

Répondre

4

Je viens de reproduire votre problème et a la même erreur - il semble que la fonction ne peut pas fonctionner à partir d'une instruction DELETE. Le texte intégral de l'erreur est:

ORA-04091: table HOU.LONGTABLE is mutating, trigger/function may not see it 
ORA-06512: at "TONY.SEARCH_LONG", line 4 

Cette approche procédurale fonctionnera:

begin 
    for r in (select id from longtable 
      where search_long(rowid) like '%hello%') 
    loop 
    delete longtable where id = r.id; 
    end loop; 
end;