Oracle笔记(4):一个存储过程编写及C#调用

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

注意事项:

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) is

10 begin

11   insert into PEOPLE

12    (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    values

17    (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 begin

2   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 People

12 {

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 }

参考文献:

http://www.cnblogs.com/chuncn/archive/2009/01/29/1381291.html

http://www.cnblogs.com/furenjun/archive/2007/06/18/orcaleprocedure.html重点参考

你可能感兴趣的:(oracle)