(ZT)[Oracle]ASP.NET中使用ODP.NET(ODAC)對含有自定義類型參數的存儲過程進行操作

转载 2012年03月28日 10:31:11

先在schema下建立自定義類型(packages下的類型無效)

1.先建立一個object type


CREATE OR REPLACE TYPE PLANTINFO_TYPE AS OBJECT
(
  PLANT    
VARCHAR2(6),
  SUBPLANT 
VARCHAR2(6)
)


2.再建立一個collections type


CREATE OR REPLACE TYPE PLANTINFO_TAB_TYPE AS TABLE OF PLANTINFO_TYPE;


3.建立一個procedure,其參數引用以上的type

CREATE OR REPLACE PACKAGE MYPACK_TEST AS
  
PROCEDURE TEST2(PARAM1 IN MF_SAVEINFO_TAB_TYPE, PARAM2 OUT SYS_REFCURSOR);
END MYPACK_TEST;

CREATE OR REPLACE PACKAGE BODY MYPACK_TEST AS
  
PROCEDURE TEST2(PARAM1 IN MF_SAVEINFO_TAB_TYPE, PARAM2 OUT SYS_REFCURSOR) IS
  
BEGIN
    
OPEN PARAM2 FOR
      
SELECT PLANT, SUBPLANT FROM TABLE(PARAM1);
  
END TEST2;
END MYPACK_TEST;

如果想要在ASP.NET中調用以上procedure,直接用microsoft的oracleclient是沒有辦法實現的,必須引用Oracle公司出品的

ODP.NET,它是ODAC套件中的一個組件,請去Oracle官方網站下載.

 

假設你的環境已經建立好,那麼我們看如何用odp.net來調用這個存儲過程

1.先寫好一個class for oracle customer types

[OracleCustomTypeMappingAttribute("PLANTINFO_TYPE")]

    public class PlantInfoFactory : IOracleCustomTypeFactory
    {
        
#region IOracleCustomTypeFactory Members

        
public IOracleCustomType CreateObject()
        {
            
return new PlantInfo();
        }

        
#endregion
    }

    [OracleCustomTypeMappingAttribute(
"PLANTINFO_TAB_TYPE")]
    
public class PlantInfo_TabFactory : IOracleArrayTypeFactory
    {
        
#region IOracleArrayTypeFactory Members

        
public Array CreateArray(int numElems)
        {
            
return new PlantInfo[numElems];
        }

        
public Array CreateStatusArray(int numElems)
        {
            
return null;
        }

        
#endregion
    }

    
public class PlantInfo : IOracleCustomType
    {
        
private bool p_mIsNull;

        [OracleObjectMappingAttribute(
"PLANT")]
        
public String PLANT { getset; }

        [OracleObjectMappingAttribute(
"SUBPLANT")]
        
public String SUBPLANT { getset; }

        
        
public static PlantInfo Null
        {
            
get
            {
                PlantInfo info 
= new PlantInfo();
                info.p_mIsNull 
= true; ;
                
return info;
            }
        }

        
#region INullable Members

        
public bool IsNull
        {
            
get { return p_mIsNull; }
        }

        
#endregion

        
#region IOracleCustomType Members

        
public void FromCustomObject(OracleConnection con, IntPtr pUdt)
        {
            
if (PLANT != null)
                OracleUdt.SetValue(con, pUdt, 
"PLANT", PLANT);
            
else
                
throw new NullReferenceException("SaveInfo.PLANT is null");

            
if (SUBPLANT != null)
                OracleUdt.SetValue(con, pUdt, 
"SUBPLANT", SUBPLANT);
            
else
                
throw new NullReferenceException("SaveInfo.SUBPLANT is null");           

        }

        
public void ToCustomObject(OracleConnection con, IntPtr pUdt)
        {
            PLANT 
= (String)OracleUdt.GetValue(con, pUdt, "PLANT");
            SUBPLANT 
= (String)OracleUdt.GetValue(con, pUdt, "SUBPLANT");
                    }

        
#endregion

    }


2.寫方法直接調用procedure.如下:


 string ConStr = @"Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleServer)));User Id=root;Password=root;";
            PlantInfo[] records 
= new PlantInfo[1];
            PlantInfo record 
= new PlantInfo();
            record.PLANT 
= "W000";
            record.SUBPLANT 
= "MP";
            records[
0= record;

            
//DataOP.Instance.ExecuteCommand("MYPACK_TEST.TEST2", new object[] { records, null });
            using (OracleConnection oc = new OracleConnection(ConStr))
            {
                OracleCommand cmd 
= oc.CreateCommand();
                cmd.CommandText 
= "MYPACK_TEST.TEST2";
                cmd.CommandType 
= CommandType.StoredProcedure;

                OracleParameter p1 
= new OracleParameter();
                p1.OracleDbType 
= OracleDbType.Array;
                p1.Direction 
= ParameterDirection.Input;
                p1.UdtTypeName 
= "PLANTINFO_TAB_TYPE";
                p1.Value 
= records;
                cmd.Parameters.Add(p1);

                OracleParameter p2 
= new OracleParameter();
                p2.OracleDbType 
= OracleDbType.RefCursor;
                p2.Direction 
= ParameterDirection.Output;
                cmd.Parameters.Add(p2);

                oc.Open();
                
try
                {
                    OracleDataReader reader 
= cmd.ExecuteReader();
                    
//cmd.ExecuteNonQuery();
                    DataTable dt = new DataTable();
                    dt.Load(reader);
                }
                
catch (Exception ex)
                {
                    
throw ex;
                }
                
finally
                {
                    oc.Close();
                }
            }


3.上面的DataTable dt 就是調用procedure返回的結果.

至此,ASP.NET調用這种特殊的存儲過程的寫法就完成了.這种傳值的方法的好處是將值打包成一個對象傳遞給存儲過程,然後在存儲過程中再做存值等其它操作.




关于存数过程有output参数,SSM框架中获取返回参数的问题

存储过程 CREATE OR REPLACE PACKAGE ZJUFDC.PAC_FW_ZCZJ AS    procedure FW_ZCZJ(  SJ varchar2, --时间 ...
  • anqilt
  • anqilt
  • 2017年12月14日 14:59
  • 41

c#中odp.net 4.0利用odac操作oracle数据库学习(一)

c#中odp.net 4.0利用odac操作oracle数据库学习(一)
  • pengzhen8805
  • pengzhen8805
  • 2013年12月16日 17:16
  • 2611

Oracle的存儲過程編程

--创建或者更新存储过程update_user_p create or replace procedure update_user_p(param1 in varchar2) is v_t...
  • u012975700
  • u012975700
  • 2016年04月19日 17:47
  • 135

c#中odp.net 4.0利用odac操作oracle数据库学习(五)

c#中odp.net 4.0利用odac操作oracle数据库学习(五) 简介:上篇文章中我们讲述了对RawImageMetaData业务操作类的封装就完成了,          接下来我们需...
  • pengzhen8805
  • pengzhen8805
  • 2013年12月16日 18:38
  • 1138

根据存储过程包含某个关键字,查找相关所有存储过程信息及根据多个主键删除重复列

--STUFF用法, ReportDetail 表存储的PersonelID为A,B,C,D 查询出来将对应A B C D 转换成人的姓名姓名1,姓名2,姓名3,姓名4 STUFF((SELECT ...
  • happy664618843
  • happy664618843
  • 2015年01月23日 11:54
  • 479

oracle编写 函数和存储过程

转载自:  http://blog.csdn.net/lailai186/article/details/19115123 6.1 引言 6.2 创建函数 6.3 存储过程 6.3.1 创建过程 ...
  • Denghejing
  • Denghejing
  • 2016年09月28日 16:47
  • 1828

oracle-存储过程练习

--====================================存储过程=============================================== /* *scm_is...
  • y541397839
  • y541397839
  • 2014年11月13日 15:30
  • 978

ORACLE 定时执行存储过程job

/*  查询: select job,broken,what,interval,t.* from user_jobs t;  job job的唯一标识,自动生成的    bro...
  • lenovouser
  • lenovouser
  • 2015年12月10日 08:08
  • 1485

MSSQL中存储过程的可选参数的定义和使用_SQL高亮显示

编辑日志: 160508创建 160530优化添加:显式传参 160916SQL语句高亮显示、格式优化 可选参数的存在,可以极大的降低代码的重复冗余。在数据库开发中,也是如此。现在针对MSSQL...
  • hjnth
  • hjnth
  • 2016年09月16日 10:56
  • 849

ORACLE 存儲過程發郵件

CREATE OR REPLACE PROCEDURE PROCSENDEMAIL(P_TXT       VARCHAR2,                                    ...
  • qingfeng45697
  • qingfeng45697
  • 2016年03月16日 15:23
  • 162
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(ZT)[Oracle]ASP.NET中使用ODP.NET(ODAC)對含有自定義類型參數的存儲過程進行操作
举报原因:
原因补充:

(最多只允许输入30个字)