我的ODP.NET开发之路3-Oracle Package/Procedure/Function

上周的项目进展比较大,完成了几个重大的功能。这其中涉及到在Oracle中创建新表、序列、索引、触发器、包、存储过程、函数,当然了也在实战中学习了几个.Net的Dataset\Datatable的用法。一直想写,不过项目紧,真没空。这不今天有点时间,但是很多东西又没那么强烈的书写欲望了。

说说今天工作遇到的几个东东吧,第一个是Oracle中的包。不晓得为什么Oracle设计包,并且把存储过程和函数都写在不同的包里,而MSSQL虽然也都有存储过程和函数,但是基本上所有的C#程序调用都是对存储过程的操作。Oracle中的存储过程如果放在包内,C#程序使用“包名.存储过程(变量)”或者“包名.函数(变量)”的形式来访问。

对于创建或者修改包的语法我就不重复了,你可以搜索一下。不过有一点我需要分享给大家,在Function中,如果对变量赋值,写法可不一样。

MSSQL中一般写成

<br/>@BlockingReason nvarchar(50)<br/><br/>Select @BlockingReason = value from table where ...<br/>

而在Oracle中是Select value into variable from table where …,看下面的例子

<br/>BlockingReason   varchar2(100);<br/>select trim(nvl(ipbp.t$brea,'')) into BlockingReason<br/>               from baan.ttdipu010301 ipbp  -- item - purchase BP data<br/>              where upper(trim(ipbp.t$item)) = upper(sWAIPartNumber)<br/>                and ipbp.t$otbp =  upper(sBusinessPartnerCode)<br/>                and rownum <=1 order by rownum;<br/>

第二个要分享的是3个很有用的Oracle函数:SUBSTR、DECODE、NVL
SUBSTR(Value,1,5) 取出从Value的第1位开始取5个字符长度
NVL(Value,’a’) 如果Value为Null返回a
DECODE比较复杂,如果你需要针对一个值做很多判断的时候,不用写case了。这个详细的介绍和用法,你搜索一下吧,我解释不清楚。

第三个要分享的,其实是C# .Net的一个Datatable绑定到Dropdownlist的代码,包括了选择值的默认选项

<br/>WAIonTracFailureModes oFailureModes = new WAIonTracFailureModes(_oWorkItem.ApplicationID);<br/><br/>        DataTable dt = oFailureModes.List().Tables[0].Copy();<br/>        DataRow[] drs = dt.Select("ParentID=0");<br/>        foreach (DataRow r in drs)<br/>        {<br/>            //text,value<br/>            WAIonTracFailureModeList.Items.Add(new ListItem(r["Name"].ToString(), r["FailureModeID"].ToString()));<br/>        }<br/><br/>        //WAIonTracFailureModeList.DataSource = oFailureModes.List();<br/>        //WAIonTracFailureModeList.DataTextField = "Name";<br/>        //WAIonTracFailureModeList.DataValueField = "FailureModeID";<br/>        //WAIonTracFailureModeList.DataBind();<br/><br/>        //DataRow[] drs2 = dt.Select("ParentID="+_oWorkItem.FailureModeID);<br/>        DataTable dt2 = oFailureModes.List().Tables[0].Copy();<br/>        DataRow[] drs2 = dt2.Select();<br/>        //<br/>        if (_oWorkItem.FailureModeID != null)<br/>        {<br/>            drs2 = dt2.Select("ParentID=" + _oWorkItem.FailureModeID);<br/>        }<br/><br/>        foreach (DataRow r2 in drs2)<br/>        {<br/>            //text,value<br/>            WAIonTracDetailsOfFailureList.Items.Add(new ListItem(r2["Name"].ToString(), r2["FailureModeID"].ToString()));<br/>        }<br/>

绑定默认/选择值的

<br/>WAIonTracFailureModeList.SelectedIndex = WAIonTracFailureModeList.Items.IndexOf(WAIonTracFailureModeList.Items.FindByValue(_oWorkItem.FailureModeID.ToString()));<br/>        WAIonTracDetailsOfFailureList.SelectedIndex = WAIonTracDetailsOfFailureList.Items.IndexOf(WAIonTracDetailsOfFailureList.Items.FindByValue(_oWorkItem.DetailsOfFailureID.ToString()));<br/>

先写这么多吧,比较乱。另外,昨天买的《涂抹Oracle-三思笔记之一步一步学Oracle》已经到手,目前只知道如何用了,但是“为什么”还不知道,希望这本评价颇高的书能告诉我。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据