1. 程式人生 > >在Oracle中使用字串陣列引數

在Oracle中使用字串陣列引數

        今天在專案中需要使用一個字串陣列引數,其實本來打算在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、儲存過程如下:

  1. PROCEDURE GetOrgInforResults(shortname varchar2,strOrg IN AssocArrayVarchar2_t,g_cursor out t_cursor )
  2. as
  3.             v_str varchar2(200);
  4.             v_str2 varchar2(2000);
  5.         begin
  6.             v_str:= 'select og_id,og_name from orginfor where isuse=''1''
  7.             and og_id 
    in ( ';
  8.             FOR i IN 1..strOrg.count LOOP
  9. if(i = strOrg.count)then
  10.                      v_str2:=v_str2||''''||strOrg(i)||'''';
  11. else
  12.                      v_str2:=v_str2||''''||strOrg(i)||''',';
  13.             end if;
  14.             END LOOP;
  15.             v_str:=v_str||v_str2||' ) group by og_id,og_name'
    ;
  16.             open g_cursor for v_str;
  17.             end;

               4、呼叫程式碼如下:

  1. publicstatic DataSet GetOrgInforByName(string orgName, string[] strOrg, string tableName)
  2.         {
  3.             Oracle.DataAccess.Client.OracleParameter[] param = new Oracle.DataAccess.Client.OracleParameter[3];
  4.             param[0] = new Oracle.DataAccess.Client.OracleParameter("shortname", OracleDbType.Varchar2, 14);
  5.             param[0].Value = orgName;
  6.             param[1] = new Oracle.DataAccess.Client.OracleParameter("strOrg", OracleDbType.Varchar2, strOrg.Length);
  7.             param[1].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
  8.             param[1].Value = strOrg;
  9.             param[1].Direction = ParameterDirection.Input;
  10.             param[2] = new Oracle.DataAccess.Client.OracleParameter("tableName", OracleDbType.RefCursor);
  11.             param[2].Direction = ParameterDirection.Output;
  12.             DataSet ds = OracleHelper_Assess.ExecuteDataSet(OracleProvider.connectionStringWithConfig, CommandType.StoredProcedure,
  13.                 GetOrgInforResult,tableName,
  14.                 param);
  15. return ds;
  16.         }

        這裡仿照了微軟的OracleHelper製作了一個自定義的類:OracleHelper_Assess,裡面的方法是一樣的。

        過程其實和Oracle提供的案例差不多,只是使用完畢之後才發覺拼接字串的過程從cs檔案中轉移到了儲存過程中,不曉得這樣是不是提高了程式碼的效率……

        另外,就是本來打算在空間裡定義一個型別的:create or replace type AssocArrayVarchar2 is table of varchar2(100);但是這樣做了之後發現呼叫的事後,會報異常【引數的個數或者型別不正確】,最後是將這個型別放入包頭中定義,原因未知……