oracle 返回多个结果集

oracle sql部分:

包声明:

CREATE OR REPLACE PACKAGE SELECT_LJTQXBYWELLID AS
TYPE T_CURSOR IS REF CURSOR;
PROCEDURE Getljtqx(
    LJT_QX_GR_500_LJT OUT T_CURSOR,
    LJT_QX_CNL_500_LJT OUT T_CURSOR,
    LJT_QX_DEN_500_LJT OUT T_CURSOR,
    LJT_QX_R250_500_LJT OUT T_CURSOR,
    wellid in varchar2
);
END SELECT_LJTQXBYWELLID;

 

包体

CREATE OR REPLACE PACKAGE BODY SELECT_LJTQXBYWELLID AS
PROCEDURE Getljtqx
(
LJT_QX_GR_500_LJT OUT T_CURSOR,
LJT_QX_CNL_500_LJT OUT T_CURSOR,
LJT_QX_DEN_500_LJT OUT T_CURSOR,
LJT_QX_R250_500_LJT OUT T_CURSOR,
wellid in varchar2
)
IS
BEGIN
OPEN LJT_QX_GR_500_LJT FOR
SELECT * FROM  LJT_QX_GR_500_LJT  WHERE jh=wellid;
OPEN LJT_QX_CNL_500_LJT FOR
SELECT * FROM  LJT_QX_CNL_500_LJT  WHERE jh=wellid;
OPEN LJT_QX_DEN_500_LJT  FOR
SELECT * FROM  LJT_QX_DEN_500_LJT  WHERE jh=wellid;
OPEN LJT_QX_R250_500_LJT FOR
SELECT * FROM  LJT_QX_R250_500_LJT  WHERE jh=wellid;
END Getljtqx;
END SELECT_LJTQXBYWELLID;

 

oracle本身并不支持返回多个结果集,所以要通过游标的方式,要完成效果,注意以下几点

(1)在写上述sql的时候,编译怎么发生“无效字符”这样的错误 ,查了很久,才知道 是因为汉化的plsql中可能带有中文空格什么的,所以把前边的空格全部去掉,中间的空格在英文的状态下重写一下,好了,错误排除。

 

C#部分:

 

代码
            DataSet ds  =   new  DataSet();
            OracleConnection conn 
=   new  OracleConnection(_connStr); 
            OracleCommand command 
=  conn.CreateCommand();   
            command.CommandText 
=   " select_ljtqxbywellid.Getljtqx " ;
            command.Parameters.Add(
" LJT_QX_GR_500_LJT " , OracleType.Cursor).Direction  =  ParameterDirection.Output;
            command.Parameters.Add(
" LJT_QX_CNL_500_LJT " , OracleType.Cursor).Direction  =  ParameterDirection.Output;
            command.Parameters.Add(
" LJT_QX_DEN_500_LJT " , OracleType.Cursor).Direction  =  ParameterDirection.Output;
            command.Parameters.Add(
" LJT_QX_R250_500_LJT " , OracleType.Cursor).Direction  =  ParameterDirection.Output;
            command.Parameters.Add(
" WELLID " , OracleType.VarChar).Direction  =  ParameterDirection.Input;
            command.Parameters[
" WELLID " ].Value = " BK20 " ;
            command.CommandType 
=  CommandType.StoredProcedure;
            
using  (OracleDataAdapter da  =   new  OracleDataAdapter(command))
            {
                da.TableMappings.Add(
" Table " " LJT_QX_GR_500_LJT " );
                da.TableMappings.Add(
" Table1 " " LJT_QX_CNL_500_LJT " );
                da.TableMappings.Add(
" Table2 " " LJT_QX_DEN_500_LJT " );
                da.TableMappings.Add(
" Table3 " " LJT_QX_R250_500_LJT " );
                da.Fill(ds);      
            }

 

 

(2)在上述代码中da.TableMappings.Add("Table", "LJT_QX_GR_500_LJT");//da经过Fill方法以后,填充到dataset中的表的名字默认是"Table","Table2"..."TableN", 要想使dataset中的表名是我们所要的,就要用些方法来匹配表名,切记,“Table”中T 必须是大写。

 

PS:在此之前,没有接触过包,这次用了以后个人觉得包就是像类一样的把类型,函数,过程封装在一起,为使用及管理提供方便,这是一方面,另外一方面有些应用中确实离不开包。

Over!
               

你可能感兴趣的:(oracle)