oracle 存储过程定义及调试,并最终被C# 调用 代码
2015-07-18 20:19
681 查看
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)));
}
参考了很多文章,写了如下文字,算是分享吧
目的:更改积分,并作一定校验
一、一般的调试方法:
方法一:带返回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)));
}
相关文章推荐
- MySQL存储过程
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- Oracle 10g R2不能使用EM的问题
- 表空间操作
- PreparedStatement中in子句的处理
- c#调用COM组件
- VMware下RedHat4.8_64位安装Oracle 10g RAC--简略脚本
- oracle sql日期比较
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- OS block size和Oracle block size,查找OS Blocksize的方法
- oracle中创建数据库和表空间的几点总结
- 数据库自动备份脚本
- ASP程序与SQL存储过程结合使用详解
- C#实现把指定数据写入串口
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化