2010-11-19 25 views
1

J'ai un certain nombre de classes d'accès aux données générées automatiquement pour gérer des choses comme les insertions & mises à jour.Comment appeler une fonction oracle dans le cadre d'une requête paramétrée?

Ceux-ci ressemblent:

cmd.CommandType = CommandType.Text 
cmd.CommandText = "UPDATE myTable set f1 = :f1, f2 = :f2, f3 = :f3 where id = :id" 

cmd.Parameters.AddWithValue(":f1", _f1) 
cmd.Parameters.AddWithValue(":f2", _f2) 
cmd.Parameters.AddWithValue(":f3", _f3) 
cmd.ExecuteNonQuery() 

Si je devais réécrire le SQL pour faire ce que je veux, il ressemblerait à quelque chose comme

cmd.CommandText = "UPDATE myTable set f1 = pkg.getMyValue, f2 = :f2, f3 = :f3 where id = :id" 

Est-il possible de le faire par définir _f1 à une valeur "spéciale", sans modifier la mise à jour SQL ou la façon dont les paramètres sont définis? Seulement dans certains cas, je dois définir la valeur de f1 - la plupart du temps, il sera nul.

.net 2.0 L'utilisation et System.Data.OracleClient contre oracle 11.

Répondre

0

Non, vous ne pouvez pas. Une variable de liaison est un littéral, vous ne pouvez pas spécifier un paquet à exécuter.

Vous pourriez envisager un déclencheur sur la table sous-jacente qui remplit f1 avec pkg.getMyValue si elle est nulle:

create or replace trigger myTrigger 
before insert or update on myTable for each row 
begin 
    if :new.f1 is null 
    then 
    :new.f1 := pkg.getMyValue; 
    end if; 
end; 
/