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()或程序或函數返回奇異值但不表一些代碼。
Xelom嗨,這將是確定如果我想要一個單一的值是的。但我假裝獲得多個值和多行。 我有辦法做到這一點,但它是不安全的,並傾向於sql注入(使用基本的方式來設置我的sql和變量在字符串中,併發送字符串在cmd.CommandText)。由於我想避免這樣做,我嘗試了我顯示的方式,但它不工作。 – FEST 2013-04-11 10:08:12
編輯我的答案多行然後 – Xelom 2013-04-11 12:49:56
嗨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