簡體   English   中英

如何從C#調用Oracle過程

[英]How to call an Oracle Procedure from C#

從C#代碼,我試圖從Oracle調用PACKAGE.PROCEDURE()。 在這個簡單的示例中,我應該從過程調用中獲得一個值,但是我得到的只是錯誤:

調用“ RETURN_NUM”時參數的數量或類型錯誤

該過程聲明如下:

PROCEDURE return_num(xNum OUT NUMBER) AS
  BEGIN
    xNum:= 50;
    dbms_output.put_line('hello world ' || xNum);
  END;

C#代碼:

Oraclecon.Open();
                    OleDbCommand myCMD = new            OleDbCommand("TEST.return_num", Oraclecon);
                    myCMD.CommandType = CommandType.StoredProcedure;
                    myCMD.Parameters.Add("xNum", OleDbType.Numeric);

                    OleDbDataReader myReader;
                    myReader = myCMD.ExecuteReader();

有人可以指出我做錯了嗎。 然后在實際情況下,我想調用一個從自定義Type返回一組值的過程,例如:

TYPE r_interface_data IS RECORD
    (
     object_id             VARCHAR2(16),     
     obj_type              VARCHAR2(32)
    );

    TYPE t_interfase_data IS TABLE OF r_interface_data;

我該如何處理。 謝謝!

更新:在我的特定情況下,我最終采用以下方法

using (OleDbCommand cmd = new OleDbCommand("PACKAGE.procedure_name"))
                {
                    cmd.CommandType = CommandType.StoredProcedure;

                    SqlManager sqlManager = new SqlManager();
                    return sqlManager.GetDataSet(cmd);
                }

我不認為您離我們有那么遠...試試這個:

OracleCommand cmd = new OracleCommand("return_num", Oraclecon);
cmd.Parameters.Add(new OracleParameter("xNum", OracleDbType.Decimal,
    ParameterDirection.Output));
cmd.CommandType = CommandType.StoredProcedure;

cmd.ExecuteNonQuery();
OracleDecimal d = (OracleDecimal)cmd.Parameters[0].Value;
double result = d.ToDouble();

result現在包含過程中的out參數。

我認為您的問題是您正在嘗試在存儲過程上使用DbDataReader DbDataReader用於查詢。

另外,我使用了ODP.net-您使用Ole可能會或可能不會導致您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM