在Oracle中使用字符串数组参数

来源:互联网 发布:电脑怎么连接网络 编辑:程序博客网 时间:2024/04/26 11:08

        今天在项目中需要使用一个字符串数组参数,其实本来打算在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.             
  17.             open g_cursor for v_str;
  18.             end;

               4、调用代码如下:

  1. public static 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);但是这样做了之后发现调用的事后,会报异常【参数的个数或者类型不正确】,最后是将这个类型放入包头中定义,原因未知……

原创粉丝点击