今天是第一次写Oracle的存储过程,由于新手,被一些东西纠结了一天。特此记录下,让自己以后不要在犯错了。
1.count(*)
第一次写Oracle的存储过程,没什么经验,就count(*)这个问题,让我正正花费了一个早上。
example:
CREATE OR REPLACE PROCEDURE Demo( IdentityCardNo IN VARCHAR2) as
v_Count number;
Begin ...
select count(*) into v_Count from userinfo where identityCardNo(身份证)=identityCardNo 按理说,这只是个简单语句。就是看看这个身份证
在userinfo表中是否存在值。v_Count只会是0或者1,可是输出的时候会输出500+或是5000+。直接在SQL窗口执行都没问题,但是在
存储过程里就出现这奇怪的数字。
解决:
后来是发现我定义的参数名和数据库中表的字段名一样了,将定义的参数名(IdentityCardNo)成改掉就可以了。(但是还是不清楚原理是为什么?如果大家有知道原理的,请告诉下我。)
2.Net调用问题了
数据库中一定存在"Demo" 的存储过程,但是调用
OracleParameter[] parameter = new OracleParameter[]{
new OracleParameter("Content", OracleType.Number),
new OracleParameter("result_Num", OracleType.Number)};
parameter[0].Value = ...;
parameter[1].Value = ...;
parameter[0].Direction = ParameterDirection.Input;
parameter[1].Direction = ParameterDirection.Output;
int rowEffect;
DbHelperOra.RunProcedure("Demo", parameter,out rowEffect);就会出现
ORA-06550: 第 1 行, 第 23 列:
PLS-00222: 在此范围中不存在名为 Demo 的函数
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
完全不明所以了,最后终于在google里找到一个方案了。原地址:http://m.blog.csdn.net/blog/mm3646/7848180
对于存储过程中,含有输出类型的参数,如: ResultValue out number 时,在界面上 传参时,不能用 int result= DbHelperOra.RunProcedure("PRJ_PersonalLogTask_PKG.ChangeWorkTask", param,out rowEffect); 这种形式 要修改成:
修改成:DbHelperOra.RunProcedure("Demo", parameter);
int resuleNum=Convert.ToInt32(parameter[1].Value);
这样就可以了。
由于第一次写Oracle存储过程,就这两个问题真是困扰了一天,先自己记录一下,防止以后犯同样的错误。