在Oracle中使用字串陣列引數
阿新 • • 發佈:2019-02-01
今天在專案中需要使用一個字串陣列引數,其實本來打算在cs檔案中拼接字串的,不過leader說可以在Oracle中使用陣列引數,所以就看看了……
其具體過程如下:
1、需要的類的名稱空間:
A、Oracle.DataAccess.Client
B、Oracle.DataAccess.Types
2、資料庫包中定義如下:
TYPE t_cursor is ref cursor; -- 遊標
TYPE AssocArrayVarchar2_t is table of VARCHAR2(100) index by BINARY_INTEGER; --陣列引數型別
3、儲存過程如下:
- PROCEDURE GetOrgInforResults(shortname varchar2,strOrg IN AssocArrayVarchar2_t,g_cursor out t_cursor )
- as
- v_str varchar2(200);
- v_str2 varchar2(2000);
- begin
- v_str:= 'select og_id,og_name from orginfor where isuse=''1''
- and og_id
- FOR i IN 1..strOrg.count LOOP
- if(i = strOrg.count)then
- v_str2:=v_str2||''''||strOrg(i)||'''';
- else
- v_str2:=v_str2||''''||strOrg(i)||''',';
- end if;
- END LOOP;
- v_str:=v_str||v_str2||' ) group by og_id,og_name'
- open g_cursor for v_str;
- end;
4、呼叫程式碼如下:
- publicstatic DataSet GetOrgInforByName(string orgName, string[] strOrg, string tableName)
- {
- Oracle.DataAccess.Client.OracleParameter[] param = new Oracle.DataAccess.Client.OracleParameter[3];
- param[0] = new Oracle.DataAccess.Client.OracleParameter("shortname", OracleDbType.Varchar2, 14);
- param[0].Value = orgName;
- param[1] = new Oracle.DataAccess.Client.OracleParameter("strOrg", OracleDbType.Varchar2, strOrg.Length);
- param[1].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
- param[1].Value = strOrg;
- param[1].Direction = ParameterDirection.Input;
- param[2] = new Oracle.DataAccess.Client.OracleParameter("tableName", OracleDbType.RefCursor);
- param[2].Direction = ParameterDirection.Output;
- DataSet ds = OracleHelper_Assess.ExecuteDataSet(OracleProvider.connectionStringWithConfig, CommandType.StoredProcedure,
- GetOrgInforResult,tableName,
- param);
- return ds;
- }
這裡仿照了微軟的OracleHelper製作了一個自定義的類:OracleHelper_Assess,裡面的方法是一樣的。
過程其實和Oracle提供的案例差不多,只是使用完畢之後才發覺拼接字串的過程從cs檔案中轉移到了儲存過程中,不曉得這樣是不是提高了程式碼的效率……
另外,就是本來打算在空間裡定義一個型別的:create or replace type AssocArrayVarchar2 is table of varchar2(100);但是這樣做了之後發現呼叫的事後,會報異常【引數的個數或者型別不正確】,最後是將這個型別放入包頭中定義,原因未知……