执行 C#的服务器端程序调用Oracle的存储过程报错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了执行 C#的服务器端程序调用Oracle的存储过程报错相关的知识,希望对你有一定的参考价值。
错误类型:PLS-00306: 调用 'ZXF_JS' 时参数个数或类型错误
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
存储过程定义:
CREATE OR REPLACE procedure NQ.zxf_js
(
v_ddrq date,
v_sdrq date,
v_xx varchar2,
v_fhdw varchar2,
v_fromport varchar2,
v_toport varchar2,
v_zxf out int
)
is 。。。。
C#调用语句:
public string SpExeFor(DateTime m_A, DateTime m_B,string m_C,string m_D,string m_E,string m_F,int m_J)
//存储过程的参数声明
OracleParameter[] parameters =
new OracleParameter("paramin",OracleType.DateTime ,20),
new OracleParameter("paramin",OracleType.DateTime,20),
new OracleParameter("paramin",OracleType.VarChar,20),
new OracleParameter("paramin",OracleType.VarChar ,20),
new OracleParameter("paramin",OracleType.VarChar,20),
new OracleParameter("paramin",OracleType.VarChar,20),
new OracleParameter("paramout",OracleType.Int16 ,10)
;
parameters[0].Value = m_A;
parameters[1].Value = m_B;
parameters[2].Value = m_C;
parameters[3].Value = m_D;
parameters[4].Value = m_E;
parameters[5].Value = m_F;
// parameters[6].Value = m_J;
parameters[0].Direction = ParameterDirection.Input;
parameters[1].Direction = ParameterDirection.Input;
parameters[2].Direction = ParameterDirection.Input;
parameters[3].Direction = ParameterDirection.Input;
parameters[4].Direction = ParameterDirection.Input;
parameters[5].Direction = ParameterDirection.Input;
parameters[6].Direction = ParameterDirection.Output;
// parameters[2].Direction = ParameterDirection.InputOutput;
try
RunProcedure("zxf_js", parameters);
return parameters[6].Value.ToString();
catch (Exception e)
throw e;
麻烦帮助解决,非常感谢了!
//存储过程的参数声明
OracleParameter[] parameters =
new OracleParameter("v_ddrq",OracleType.DateTime),
new OracleParameter("v_sdrq",OracleType.DateTime),
new OracleParameter("v_xx",OracleType.VarChar,20),
new OracleParameter(" v_fhdw",OracleType.VarChar ,20),
new OracleParameter("v_fromport",OracleType.VarChar,20),
new OracleParameter("v_toport",OracleType.VarChar,20),
new OracleParameter("v_zxf",OracleType.Int16)
;
parameters[0].Value = m_A;
parameters[1].Value = m_B;
parameters[2].Value = m_C;
parameters[3].Value = m_D;
parameters[4].Value = m_E;
parameters[5].Value = m_F;
parameters[6].Direction = ParameterDirection.Output;
try
RunProcedure("zxf_js", parameters);
return parameters[6].Value.ToString();
catch (Exception e)
throw e;
参考技术A 错误类型:PLS-00306: 调用 'ZXF_JS' 时参数个数或类型错误
提示已经很清楚了,你的参数能错了.、
debug 看看吧!追问
调试没看出来问题,看到赋值也是对的,输入7个参数,存储过程也是7个参数,不知道类型是否匹配,麻烦帮我检查C#设定的参数和存储过程定义的参数是否匹配,请提建议啊,多谢。
存储过程
存储过程是数据库对象之一,存储过程可以理解成数据库的子程序,在客户端和服务器端可以直接调用它。触发器是与表直接关联的特殊的存储过程,是在对表记录进行操作时触发的。
存储过程放在字典里,可以在不同用户和应用程序之间共享,并可以实现程序的优化和重用。
存储过程的优点:
1.存储过程在服务器端运行,执行速度快。
2.存储过程执行一次后,代码就驻留在高速缓存,在以后的操作中,只需要从高速缓存中调用已编译代码执行,提高了系统性能。
3.确保数据库安全。可以不授权用户直接访问应用程序中的一些表,而是授权用户执行访问这些表的存储过程,非表的授权用户除非通过存储过程,否则就不能访问这些表。
4.自动完成需要执行的任务,存储过程可以在系统启动时自动执行,而不必在系统启动后再进行手工操作,大大方便了用户的使用,可以自动完成一些需要预先执行的任务。
SQL命令创建存储过程:
create or replace procedure 过程名称( 参数名称 in/out/in out 类型) is/as begin 过程体 end 过程名称
说明:
1.过程名称:存储过程名称要符合标识符规则,并且在所属方案中必须是唯一的。关键字 or replace 表示在创建存储过程时,如果已存在同名的过程,则重新创建
2.参数名:存储过程函数的参数名也要符合标识符规则,创建过程时,可以声明一个或多个参数,执行过程时应提供相对应的参数,存储过程的参数模式和函数参数一样,也有三种模式:in out和in out。
其中:in 表示参数是输入给过程的
out 表示参数在过程中将被赋值,可以传给过程体的外部
in out 表示该类型的参数既可以向过程体传值,也可以在过程中赋值
3.过程体:其中包含PL/SQL语句块
在用户的定义中不能使用下列对象创建语句:
create view
create default
create rule
create procedure
create trigger
--计算指定某门课程参加考试的学生人数。 create or replace procedure count_result(v_course in char,v_num out number) as begin select count(*) into v_num from SCHOOL_RESULT where RESULT_COURSE=v_course; end count_result;
注意:在存储过程体中,不能使用select语句直接查询,否则会出现编译错误。
通过界面创建存储过程:
存储过程的调用:
set serveroutput on; declare v_number number; begin count_result(‘100011‘,v_number); dbms_output.put_line(v_number); end;
存储过程的编辑修改:
修改存储过程和修改视图一样,也有alter procedure语句,但它是用于重新编译或验证现有过程,如果要修改过程定义,仍然应用reeate or replace procedure命令,语法格式一样。
也可以通过界面修改存储过程(在SQL Developer中"过程"右击鼠标,选择“编辑”)
存储过程的删除:
当某个过程不在需要时就应将其删除,以释放它占用的内存资源
drop procedure 过程名;
以上是关于执行 C#的服务器端程序调用Oracle的存储过程报错的主要内容,如果未能解决你的问题,请参考以下文章
c# 调用Oracle存储过程 PLS-00201:必须声明标识符