zoukankan      html  css  js  c++  java
  • 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重点参考

    文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家留言交流,转载请注明出处。
  • 相关阅读:
    setlocale
    c++的 程序实体 作用域 名空间 变量生存期概念理解
    本人的Ubuntu 10.04配置清单
    hadoopStreamming 编程 Angels
    级联 mapreduce (Cascading Mapreduce) Angels
    委托
    OPC和XML/SOAP/Web Services
    实例管理2(会话服务)
    实例管理3()
    操作(Operation)
  • 原文地址:https://www.cnblogs.com/yhlx125/p/2690317.html
Copyright © 2011-2022 走看看