博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle笔记(4):一个存储过程编写及C#调用
阅读量:6196 次
发布时间:2019-06-21

本文共 6455 字,大约阅读时间需要 21 分钟。

存储过程的参数和过程或函数的参数类似,存储过程的变量类似于过程或者函数的局部变量。 

注意事项:

1,  存储过程参数不带取值范围,in表示传入,out表示输出

2,  变量带取值范围,后面接分号

3,  在判断语句前最好先用count(*)函数判断是否存在该条操作记录

4,  用select 。。。into。。。给变量赋值

5,  在代码中抛异常用 raise+异常名

注:易犯错误

--以上语句均在"SQL*Plus 工作单"上运行;
  
1.每一个小单元的语句后要加';'号;
  
2.不能将字符串赋值的单引号写成双引号;
    如: err:
='更新成功!'; 不能写成 err:="更新成功!";
    以上错误系统将提示:"警告: 创建的过程带有编译错误。"
  
3.存储过程传递与赋值的参数名称,个数,类型(字段类型,返回的类型(in/out))要与调用的存储过程以及该存储过程
    所访问的表中相应的字段类型严格对应.
    还有一些约定的写法也需遵守.
    如:其中的" M_KSCJ "对应表中的" KSCJ "字段, 应写成(M_KSCJ 
in integer)不能写成( M_KSCJ in  number(3));
    "M_SN"对应表中的 "SN" 字段,应写成 (M_SN 
in char) 不能写成 (M_SN in Varchar2)
  
4.在c#中进行调用时,还要注意它的输入/输出类型,如上例中的" out integer res "  为输出类型,应将其
      OracleParameter
[] parm = new OracleParameter[1];
      parm
[0] = new OracleParameter("RES", OracleType.Int16   );
      parm
[0].Direction = ParameterDirection.Output  ; --将其设为输出类型;
      具体调用方法将在稍后进行介绍;
  
5.定义存储过程时,其参数名称最好不要与字段名称同名(不区分大小写);
     如上面的存储过程建议不要写成:
     WRITE_SRC( SN 
in char  , XM in  varchar2,KSCJ in integer,
                KSRQ 
in Date,RES out integer,ERR out varchar2)

存储过程如下:

1 create or replace procedure PEOPLE_INSERT( 2    senderid in NVARCHAR2,   peoplename in NVARCHAR2, 3    idnumber     in       NVARCHAR2,   rank_worktype   in      NVARCHAR2, 4    dept         in        NVARCHAR2,   mainworkplace   in      NVARCHAR2, 5    birthday      in       DATE,        gender       in         NVARCHAR2, 6    bloodtype      in      NVARCHAR2,   allergy       in        NVARCHAR2, 7    ismarried     in        NVARCHAR2,   phone       in         NVARCHAR2, 8    tel           in        NVARCHAR2,   address     in         NVARCHAR2, 9    certificate    in       NVARCHAR2,   valuedate    in        DATE) is10 begin11   insert into PEOPLE12    (SENDER_ID,PEOPLE_NAME,ID_NUMBER,13    RANK_WORKTYPE,DEPT,MAINWORKPLACE,BIRTHDAY ,14    GENDER,BLOOD_TYPE,ALLERGY,ISMARRIED,15    PHONE , TEL, ADDRESS , CERTIFICATE , VALUEDATE )16    values17    (senderid,peoplename,idnumber,rank_worktype,dept,mainworkplace,birthday,gender,18    bloodtype,allergy,ismarried,phone,tel,address,certificate,valuedate);19 end PEOPLE_INSERT;

Oracle调用(通过PLSQL Developer):

1 begin2   people_insert('hsy06999','修','11111111111','无','无',3   '全矿井',to_date('1900-01-01','yyyy-mm-dd'),'男','O','','','','','','','');4   end;

C#调用类,这里OracleParameter的时间类型采用OracleType.DateTime,将.Net的DateTime类型直接传入,由于自己的疏忽,将一个OracleParameter设置成了OracleType.String类型,这样将该参数的Value值赋值为DateTime变量是产生“月的日必须在1和当月最大天数之间”的错误,当然也可以转换到OracleDateTime类型(见注释):

View Code
1 // File:    People.cs 2 // Author:  yhlx 3 // Created: 2012年9月18日 8:57:44 4 // Purpose: Definition of Class People 5  6 using System; 7 using Transplant; 8 using System.Data.OracleClient; 9 using System.Data;10 11 public class People12 {13    public string senderId;14    public string peopleName;15    public string idNumber;16    public string rankWorktype;17    public string dept;18    public string mainworkplace;19    public DateTime birthday;20    public string gender;21    public string bloodType;22    public string allergy;23    public string ismarried;24    public string phone;25    public string tel;26    public string address;27    public string certificate;28    public DateTime valuedate;29    30    public void Fetch(string row)31    {32        string[] cel= row.Split(';');33        senderId = Convert.ToString(cel[1]);34        peopleName = Convert.ToString(cel[2]);35        idNumber= Convert.ToString(cel[3]);36        rankWorktype= Convert.ToString(cel[4]);37        dept= Convert.ToString(cel[5]);38        mainworkplace= Convert.ToString(cel[6]);39        birthday= Convert.ToDateTime(cel[7]);40        string bir = birthday.ToString();41        gender= Convert.ToString(cel[8]);42        bloodType= Convert.ToString(cel[9]);43        allergy= Convert.ToString(cel[10]);44        ismarried = Convert.ToString(cel[11]);45        phone= Convert.ToString(cel[12]);46        tel= Convert.ToString(cel[13]);47        address= Convert.ToString(cel[14]);48        certificate= Convert.ToString(cel[15]);49        if (cel[16]!="")50        {51            valuedate = Convert.ToDateTime(cel[16]);52        }53        54    }55    public void insert()56    {57        OracleParameter[] parms ={58                                    new OracleParameter("senderid",OracleType.NVarChar),59                                    new OracleParameter("peoplename",OracleType.NVarChar),60                                    new OracleParameter("idnumber",OracleType.NVarChar),61                                    new OracleParameter("rank_worktype",OracleType.NVarChar),62                                    new OracleParameter("dept",OracleType.NVarChar),63                                    new OracleParameter("mainworkplace",OracleType.NVarChar),64                                    new OracleParameter("birthday",OracleType.DateTime),65                                    new OracleParameter("gender",OracleType.NVarChar),66                                    new OracleParameter("bloodtype",OracleType.NVarChar),67                                    new OracleParameter("allergy",OracleType.NVarChar),68                                    new OracleParameter("ismarried",OracleType.NVarChar),69                                    new OracleParameter("phone",OracleType.NVarChar),70                                    new OracleParameter("tel",OracleType.NVarChar),71                                    new OracleParameter("address",OracleType.NVarChar),72                                    new OracleParameter("certificate",OracleType.NVarChar),73                                    new OracleParameter("valuedate",OracleType.DateTime)74                                };75        parms[0].Value = senderId;76        parms[1].Value = peopleName;77        parms[2].Value = idNumber;78        parms[3].Value = rankWorktype;79        parms[4].Value = dept;80        parms[5].Value = mainworkplace;81        parms[6].Value = birthday;82        //parms[6].Value = OracleDateTime.Parse(birthday.ToShortDateString());83        parms[7].Value = gender;84        parms[8].Value = bloodType;85        parms[9].Value = allergy;86        parms[10].Value = ismarried;87        parms[11].Value = phone;88        parms[12].Value = tel;89        parms[13].Value = address;90        parms[14].Value = certificate;91        parms[15].Value = valuedate;92         OracleHelper.ExecuteNonQuery(OracleHelper.connectionString,CommandType.StoredProcedure,"PEOPLE_INSERT",parms  );93    }94 }

参考文献:

重点参考

转载于:https://www.cnblogs.com/yhlx125/archive/2012/09/18/2690317.html

你可能感兴趣的文章
PeekMessage使用方法
查看>>
[转载] C#异步编程模型2--基于事件的异步模式
查看>>
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
查看>>
HttpServlet详解
查看>>
排序规则在拼音处理中的应用.sql
查看>>
C# Aop简单扫盲及ORM实体类属性拦截示例
查看>>
大数据图数据库之离线挖掘计算模型
查看>>
一个简单的ObjC和JavaScript交互工具
查看>>
我们为什么需要DTO(数据传输对象)
查看>>
将String转化成Stream,将Stream转换成String
查看>>
判断一个文件是否是指定后缀名的文件
查看>>
Enterprise Architect使用教程
查看>>
【Coursera】Technology :Fifth Week(1)
查看>>
sql语句的join用法
查看>>
[LeetCode] Add Two Numbers II 两个数字相加之二
查看>>
HDU-1828-Picture(线段树)
查看>>
第二百四十七节,Bootstrap按钮和折叠插件
查看>>
Unity3d修炼之路:游戏开发中,3d数学知识的练习【1】(不断更新.......)
查看>>
树莓派进阶之路 (015) - 树莓派使用DS18B20模块测量温度
查看>>
Android HandlerThread 源代码分析
查看>>