2010-06-23 10 views

Répondre

2

Vous ne pouvez pas utiliser de paramètres booléens dans SQL. L'appel d'une procédure stockée qui prend ou retourne une valeur booléenne ne fonctionnera donc pas en SQL. Il n'y a aucun problème à utiliser une telle procédure depuis un bloc pl/sql.

AJOUTÉE de réponse JCallico:

J'ai utilisé la solution suivante pour contourner cette limitation:

  1. Enroulez le appel de fonction à l'aide d'un bloc anonyme.
  2. Retourne une variable de sortie contenant 1 ou 0.
  3. Lire la variable de sortie et la convertir en valeur booléenne.

Voici quelques exemples de code:

using (var connection = new OracleConnection("<connection string>")) 
{ 
    var command = new OracleCommand(); 
    command.Connection = connection; 
    command.CommandText = 
     "declare v_bool boolean;" + 
     "begin " + 
     "v_bool := auth_com.is_valid_username (:username); "+ 
     "if (v_bool = TRUE) then select 1 into :v_result from dual; end if; " + 
     "if (v_bool = FALSE) then select 0 into :v_result from dual; end if; " + 
     "end;"; 

    command.Parameters.Add(new OracleParameter { ParameterName = "username", OracleDbType = OracleDbType.NVarchar2, Size=512, Direction = ParameterDirection.Input }); 
    command.Parameters.Add(new OracleParameter { ParameterName = "v_result", OracleDbType = OracleDbType.Decimal, Direction = ParameterDirection.Output });  

    try 
    { 
     connection.Open(); 
     command.ExecuteNonQuery(); 
    } 
    finally 
    { 
     connection.Close(); 
    } 

    bool success = Convert.ToBoolean(((OracleDecimal)command.Parameters["v_result"].Value).ToInt32()); 
} 

EDIT:

Alex Keh d'Oracle, octobre 2013:

Nous prévoyons de soutenir ODP.NET Boolean dans le fournisseur géré à court terme, probablement au milieu de l'année prochaine.

+0

Y a-t-il une solution de rechange? Puis-je passer un type alternatif? – haymansfield

+0

Vous pouvez redéfinir votre procédure pour qu'elle prenne une valeur Y/N ou 1/0. Tout ce que tu aimes. – Rene

+0

Il y a des moments où la modification de la fonction d'origine n'est pas une option. Voir une solution de contournement ci-dessous. – JCallico

9

J'ai utilisé la solution suivante pour contourner cette limitation:

  1. Enroulez le appel de fonction à l'aide d'un bloc anonyme.
  2. Retourne une variable de sortie contenant 1 ou 0.
  3. Lire la variable de sortie et la convertir en valeur booléenne.

Voici quelques exemples de code:

using (var connection = new OracleConnection("<connection string>")) 
{ 
    var command = new OracleCommand(); 
    command.Connection = connection; 
    command.CommandText = 
     "declare v_bool boolean;" + 
     "begin " + 
     "v_bool := auth_com.is_valid_username (:username); "+ 
     "if (v_bool = TRUE) then select 1 into :v_result from dual; end if; " + 
     "if (v_bool = FALSE) then select 0 into :v_result from dual; end if; " + 
     "end;"; 

    command.Parameters.Add(new OracleParameter { ParameterName = "username", OracleDbType = OracleDbType.NVarchar2, Size=512, Direction = ParameterDirection.Input }); 
    command.Parameters.Add(new OracleParameter { ParameterName = "v_result", OracleDbType = OracleDbType.Decimal, Direction = ParameterDirection.Output });  

    try 
    { 
     connection.Open(); 
     command.ExecuteNonQuery(); 
    } 
    finally 
    { 
     connection.Close(); 
    } 

    bool success = Convert.ToBoolean(((OracleDecimal)command.Parameters["v_result"].Value).ToInt32()); 
} 

EDIT:

Alex Keh d'Oracle, octobre 2013:

Nous prévoyons de soutenir ODP.NET Boolean dans le fournisseur géré à court terme, probablement au milieu de l'année prochaine.

+0

Cela peut être pratique, par exemple – sehe

+0

Peut-être le paquet de fonctions diutil: sys.diutil.int_to_bool et sys.diutil.bool_to_int. Nécessite des autorisations dans le schéma. – Kiquenet

+0

Votre code nécessite des autorisations sur le blocage anonyme. – Kiquenet