2013-04-10 53 views
0

我試圖調用返回封裝在一個表類型的甲骨文功能C#OleDb的甲骨文功能和表類型

類型對象

create or replace 
type Z_TBL_STRUCTURE_CODE 
AS OBJECT 
(
    PROJ_ID varchar2(50 BYTE) 
); 

類型表

create or replace 
type Z_TABLE_STRUCTURE_CODE AS TABLE of Z_TBL_STRUCTURE_CODE; 

甲骨文功能

create or replace 
FUNCTION Z_TESTE_IN_FUNC 
(
    var_teste in varchar2 
) 
return Z_TABLE_STRUCTURE_CODE 
AS 
tab Z_TABLE_STRUCTURE_CODE; 
BEGIN 
    EXECUTE IMMEDIATE 
    'SELECT 
    CAST(
    MULTISET(
     select count(*) into num from structure 
     where structure_code in ('|| var_teste ||')) as Z_TABLE_STRUCTURE_CODE) 
    into tab 
    from dual;'; 
    dbms_output.put_line(var_teste); 
    return tab; 
END Z_TESTE_IN_FUNC; 

注:請忽略執行立即,它只是一個測試。注意2:我知道有一個選項可以避免類型(使用遊標),但是我還沒有能夠理解這個主題,因此我會在接到請求時忽略它,除非它是唯一可用的選項。

C#代碼

public DataTable getTaskStartFinish() 
{ 
    OleDbConnection con = null; 
    OleDbDataReader reader = null; 
    try{ 
     con = new OleDbConnection(ConfigurationManager.ConnectionStrings["OracleBD"].ConnectionString); 

     OleDbCommand cmd = new OleDbCommand("", con); 
     cmd.CommandText = "Z_TESTE_IN_FUNC"; 
     cmd.CommandType = CommandType.StoredProcedure; 

     OleDbParameter retval = new OleDbParameter("retval", OleDbType.VarChar, 10); 
     retval.Direction = ParameterDirection.ReturnValue; 

     OleDbParameter inval = new OleDbParameter("inval", OleDbType.Variant, 50); 
     inval.Direction = ParameterDirection.Input; 
     inval.Value = "1"; 

     cmd.Parameters.Add(retval); 
     cmd.Parameters.Add(inval); 
     con.Open(); 

     reader = cmd.ExecuteReader(); 

     DataTable dt = new DataTable(); 
     dt.Load(reader); 

     return dt; 
    } 
    catch(Exception ex) 
    { 
     throw new Exception("getTaskStartFinish error: " + ex.Message); 
    } 
    finally 
    { 
     if(con != null) 
      con.Close(); 
     if(reader != null || !reader.IsClosed) 
      reader.Close(); 
    } 
} 

電流誤差我得到的是以下內容: ORA-06550:第1行,第13欄: PLS-00382:表達式是錯誤的類型 ORA-06550的:第1行第7列: PL/SQL:語句忽略

我看到在網類似的例子,但所有使用的ExecuteScalar()或程序或函數返回奇異值但不表一些代碼。

回答

0

那麼,如果你想返回一個值我的建議是(編輯多行):

 OleDbConnection conn = new OleDbConnection(ConfigurationManager.ConnectionStrings["OracleBD"].ConnectionString); 
     OleDbCommand cmd = new OleDbCommand("Z_TESTE_IN_FUNC", conn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@procValueName", "myValue"); 
     OleDbDataAdapter da = new OleDbDataAdapter(cmd); 
     DataTable dt = new DataTable(); 
     conn.Open(); 
     try 
     { 
      da.Fill(dt); 
     } 
     catch (Exception excp) 
     { 
      //Handle Exception 
     } 
     finally 
     { 
      conn.Close(); 
     } 

編輯2:嘗試此功能

OleDbConnection con = new OleDbConnection(cntStr); 
con.Open(); 
OleDbCommand cmd = new OleDbCommand("F_TESTFUNC", con); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.Add(new OleDbParameter("retVal", OleDbType.VarChar, 11,ParameterDirection.ReturnValue, true, 0, 0, "retVal", DataRowVersion.Current,null); 
cmd.Parameters.Add("ID", strID); 
cmd.ExecuteScalar(); 
con.Close(); 
+0

Xelom嗨,這將是確定如果我想要一個單一的值是的。但我假裝獲得多個值和多行。 我有辦法做到這一點,但它是不安全的,並傾向於sql注入(使用基本的方式來設置我的sql和變量在字符串中,併發送字符串在cmd.CommandText)。由於我想避免這樣做,我嘗試了我顯示的方式,但它不工作。 – FEST 2013-04-11 10:08:12

+0

編輯我的答案多行然後 – Xelom 2013-04-11 12:49:56

+0

嗨Xelom。所以我嘗試了你的代碼,我得到了以下錯誤: {System.Data.OleDb.OleDbException:ORA-06550:第1行第7列: PLS-00221:'Z_TESTE_IN_FUNC'不是一個過程或者是未定義的 ORA- 06550:第1行,第7列: PL/SQL:語句被忽略。 我是否需要執行其他操作,因爲我想執行一個函數?我可以在addwithParameter中使用我想要的任何名稱嗎? – FEST 2013-04-11 17:54:12