2010-06-23 159 views

回答

2

您不能在SQL中使用布爾參數。因此調用一個存取過程或返回一個布爾值的存儲過程在SQL中不起作用。在pl/sql塊中使用這樣的過程沒有問題。

從JCallico答案增加:

我使用以下解決方法來繞過此限制:

  1. 裹使用匿名塊函數調用。
  2. 返回包含1或0的輸出變量。
  3. 讀取輸出變量並將其轉換爲布爾值。

下面是一些示例代碼:

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()); 
} 

編輯:

亞歷KEH從甲骨文,2013年10月:

我們正在支持ODP.NET計劃近期內管理提供商 中的布爾值,可能在明年年中。

+0

是否有解決方法?我可以通過其他類型嗎? – haymansfield 2010-06-23 08:07:50

+0

您可以重新定義您的程序,使其取Y/N值或1/0。隨你喜歡。 – Rene 2010-06-23 09:02:46

+0

有些時候,修改原始功能不是一個選項。請參閱下面的解決方法。 – JCallico 2010-12-07 15:34:02

9

我使用以下解決方法來繞過此限制:

  1. 裹使用匿名塊函數調用。
  2. 返回包含1或0的輸出變量。
  3. 讀取輸出變量並將其轉換爲布爾值。

下面是一些示例代碼:

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()); 
} 

編輯:

亞歷KEH從甲骨文,2013年10月:

我們正在支持ODP.NET計劃近期內管理提供商 中的布爾值,可能在明年年中。

+0

這可能派上用場,thx – sehe 2011-04-04 09:20:48

+0

也許函數包diutil:sys.diutil.int_to_bool和sys.diutil.bool_to_int。需要架構權限。 – Kiquenet 2013-10-30 13:59:00

+0

您的代碼需要有關匿名塊的權限。 – Kiquenet 2013-10-30 13:59:34

相關問題