C# 调用存储过程

參考了非常多文章,写了例如以下文字,算是分享吧

目的:更改积分,并作一定校验

一、一般的调试方法:

方法一:带返回out參数,必须定义变量 myresult

DECLARE

myresult INT;

point  VARCHAR2(50) ; //假设要用字符类的变量,须要写长度。

BEGIN 

  P_CHANGEVIPBALANCE('011111111',-1,'TEST',myresult);

END;

/*

假设不带输出參数。则能够直接用:

方法二:call   P_CHANGEVIPBALANCE('018604712233',-1,'TEST');//如果本身就没有要输出的參数。即存储过程定义为:

CREATE OR REPLACE PROCEDURE WX_120719_FLXT.p_changevipbalance ( vipno IN VARCHAR2 , point in VARCHAR2, str_reason IN VARCHAR2  )  //相比之前的没有:,myresult OUT int 这个out 參数  */

方法三:

更具体的调试方法还是PLSQL。选择要调试的过程名,找test。假设不能进入到里面去。好像要要编译,生成debug信息之类的。

二、存储过程定义:2015-7-18 20:00:21更新备注计算方法

CREATE OR REPLACE PROCEDURE WX_120719_FLXT.p_changevipbalance ( vipno IN VARCHAR2 , point in VARCHAR2, str_reason IN VARCHAR2 ,myresult OUT int )





IS

    point_old     INT;

    point_updated INT;

    yhjerror      EXCEPTION;

    tempint       INT;

    tempa         INT;

BEGIN

    myresult:=0;





    SELECT M.POINTS

      INTO point_old

      FROM MEMBERSHIP M

     WHERE TRIM(M.MEMBER_CODE) =vipno;





    UPDATE MEMBERSHIP M

           SET  M.POINTS= M.POINTS+point,

           M.REMARK=TRIM(M.REMARK)||TO_CHAR(SYSDATE,'YY-MM-DD HH24:MI:SS')||':'||str_reason

     WHERE TRIM(M.MEMBER_CODE)=vipno;



    myresult:=SQL%ROWCOUNT;

    dbms_output.put_line(point_old);

    SELECT M.POINTS

      INTO point_updated

      FROM MEMBERSHIP M

     WHERE TRIM(M.MEMBER_CODE) =vipno;





    tempa:=ABS((point_old)-(point_updated));

     tempint:=ABS(point);





    IF ((tempa <>tempint ) or  (myresult<>1)) THEN -- AND

        BEGIN

            myresult:=0;

            RAISE yhjerror;

        end;

    END IF ;

EXCEPTION

WHEN yhjerror THEN

    BEGIN

        ROLLBACK;

    END;

    COMMIT;

END p_changevipbalance;

三、存储过程被C#调用。代码:

public static String CAL_changevipbalancebyStoredProcedure(string vipno, int point, string str_reason )

        {//须要添加日志

            string strCmd = OracleAccess.str_vip_update1 + point + OracleAccess.str_vip_update2 + vipno.Trim() + "\'";

            int old_points = 0; int after_point = 0; int kkk = 0; int myresult = 0;

            //i = Convert.ToInt32(DBUtil.SqlExecuteScalar(strCmd.Replace("TESTA", OracleAccess.str_USER)));

            if (exist_vip(vipno))

            {

                old_points = int.Parse(CAL_VipBalance(vipno));

                OracleParameter[] parameters ={

                                 new OracleParameter("vipno",OracleType.VarChar,50),

                                new OracleParameter("point",OracleType.VarChar,30),

                                 new OracleParameter("str_reason",OracleType.VarChar,20),

                                new OracleParameter("myresult",OracleType.Int32)

                                                };

                parameters[0].Value = vipno; parameters[1].Value = point; parameters[2].Value = str_reason; parameters[3].Value = myresult;  //parameters[13].Value = str_sku;// parameters[10].Value = str_no; parameters[11].Value = str_sku;

                parameters[0].Direction = ParameterDirection.Input; parameters[1].Direction = ParameterDirection.Input; parameters[2].Direction = ParameterDirection.Input; parameters[3].Direction = ParameterDirection.Output;



                try

                {

                    YHJ_StoredProcedure.RunProcedure("WX_120719_FLXT.p_changevipbalance", parameters);

                    kkk = Convert.ToInt32(parameters[3].Value);

                    if (kkk>=1)

                        return OracleAccess.str_db_operate_sucess;

                        else

                    return "ERROR内部校验出错";





                }

                catch (Exception e)

                {

                    throw e;

                }



                //DBUtil.SqlExecuteNonQuery(strCmd.Replace("TESTA", OracleAccess.str_USER)); //ok 防注入,不用

                //after_point = int.Parse(CAL_VipBalance(vipno));

                //if ((after_point - old_points) == point)

                //    return OracleAccess.str_db_operate_sucess;

                //else

                //    return "ERROR内部校验出错";

            }

            else

                return "ERROR会员不存在";

            //return Convert.ToInt32(DBUtil.SqlExecuteScalar(strCmd.Replace("TESTA", OracleAccess.str_USER)));

        }

oracle 存储过程定义及调试,并终于被C# 调用 代码的更多相关文章

  1. oracle 存储过程 clob 字段 调试

    clob 没法直接赋值调试,可以新建一个存储过程,赋值给clob字段,然后调试

  2. Java调用oracle存储过程通过游标返回临时表数据

    注:本文来源于 <  Java调用oracle存储过程通过游标返回临时表数据   > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...

  3. JDBC调用oracle 存储过程

    1.创建一个oracle存储过程 p_empInfo2 并执行,使这段sql代码能编译存储到oracle数据库中. --输入员工号查询某个员工(7839)信息,将薪水作为返回值输出,给调用的程序使用 ...

  4. Oracle存储过程单步调试方法

    oracle存储过程单步调试的方法 1.在要调试的过程上单击test,如下图所示: 2.出现如下界面时单击最左上方的按钮:,如下图所示: 3.单击后呈现如下画面: 其中: 表示要停止test; 表示要 ...

  5. 项目中oracle存储过程记录——经常使用语法备忘

    项目中oracle存储过程记录--经常使用语法备忘 项目中须要写一个oracle存储过程,需求是收集一个复杂查询的内容(涉及到多张表),然后把符合条件的记录插入到目标表中.当中原表之中的一个的日期字段 ...

  6. Oracle存储过程学习使用

    存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); 变量2 类型(值 ...

  7. oracle存储过程 --1

    一,oracle存储过程语法   1.oracle存储过程结构  CREATE OR REPLACE PROCEDURE oracle存储过程名字 (     参数1 IN NUMBER,     参 ...

  8. oracle 存储过程的基本语法

    原文:oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字(    参数1 IN NUMBER,    参数2 IN NUMBER) I ...

  9. Oracle存储过程和自定义函数

    新博客文章链接,欢迎大家评论探讨 概述 存储过程和存储函数是指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数. 异同点: 存储过程和存储函数的相同点:完成特定功能的程序. 存储过程和存储 ...

随机推荐

  1. Cocos2d-x 3.4 之 消灭星星 &gt; 第三篇(终) &lt;

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  2. oracle刚開始学习的人经常使用操作100问

    oracle刚開始学习的人经常使用操作100问 1. Oracle安装完毕后的初始口令?   internal/oracle sys/change_on_install system/manager ...

  3. WAP 图片 lazyload

    原理是根据屏幕上的坐标找到需要做 lazyload 的区域 1,先监听 scroll 事件 ,scrolling_lt window.addEventListener('scroll', functi ...

  4. JavaScript DOM(一)

    文件夹: DOM家谱树 节点的基本属性和方法 document与getElement方法 DOM家谱树 DOM能够将不论什么HTML或XML文档描绘成一个由多层次节点构成的结构.当中节点被分为几种不同 ...

  5. C#上传文件

    QQ:1187362408 欢迎技术交流和学习 关于C#上传文件(产品开发): TODO: 1.文件大小不足500M(web.config配置直接处理) 2,文件大小超过500M(ASP.NET分段读 ...

  6. 1.future线程通信

    #include <future> #include<iostream> #include <thread> #include <thread> #in ...

  7. vue keep-alive保存路由状态1 (接下篇)

    本文很长,但是很详细,请耐心看完就一目了然了有下篇 keep-alive 是 Vue 内置的一个组件,使被包含的组件保留状态,或避免重新渲染. 1. 基础用法,缓存所有路由: <keep-ali ...

  8. ajax的cache缓存的使用方法

    ajax中cache缓存的使用: 问题描述: 在IE.360浏览器上提交表单后,保存后的内容不回显(依然显示空或者之前的内容). 原因: 回显内容是使用ajax的get方式的请求查询数据,ajax的c ...

  9. java中return在Try-Catch中的执行顺序

    我们知道return会结束此方法并返回指定值.以及在Try-catch-finally中无论try代码块中有没有异常finally中的代码时都会被执行的.但是如果return包含在try-catch- ...

  10. Spark Streaming 总结

    这篇文章记录我使用 Spark Streaming 进行 ETL 处理的总结,主要包含如何编程,以及遇到的问题. 环境 我在公司使用的环境如下: Spark: 2.2.0 Kakfa: 0.10.1 ...