C# 尝试在C中使用ODBC调用Oracle包时出现语法错误#

C# 尝试在C中使用ODBC调用Oracle包时出现语法错误#,c#,.net,oracle,odbc,package,C#,.net,Oracle,Odbc,Package,我正在尝试使用ODBC和C#使用Oracle 9i包。我尝试使用中描述的语法,但似乎无法正确使用 注意:在这种特殊情况下,不允许我使用ODAC/ODP.NET 这是包结构: 声明 参数1--在里面 PARAM2-VARCHAR2(200)--出来 PARAM3-VARCHAR2(200)--出来 PARAM4-VARCHAR2(200)--出来 开始 参数1:=123; PARAM2:=NULL; PARAM3:=NULL; PARAM4:=NULL; TESTUSER.TESTPKG.TEST

我正在尝试使用ODBC和C#使用Oracle 9i包。我尝试使用中描述的语法,但似乎无法正确使用

注意:在这种特殊情况下,不允许我使用ODAC/ODP.NET

这是包结构:

声明
参数1--在里面
PARAM2-VARCHAR2(200)--出来
PARAM3-VARCHAR2(200)--出来
PARAM4-VARCHAR2(200)--出来
开始
参数1:=123;
PARAM2:=NULL;
PARAM3:=NULL;
PARAM4:=NULL;
TESTUSER.TESTPKG.TESTFUNC(PARAM1、PARAM2、PARAM3、PARAM4);
DBMS_OUTPUT.Put_行(PARAM2);
DBMS_OUTPUT.Put_行(参数3);
DBMS_OUTPUT.Put_行(PARAM4);
犯罪
结束;
我是这样称呼这个包的:

string var1=“123”;
int-var2;
OdbcConnection cn=new OdbcConnection(“驱动程序={Microsoft ODBC for Oracle};服务器=(描述=(地址=(协议=TCP)(主机=测试主机)(端口=1234))(连接数据=(SID=测试SID));Uid=测试用户;Pwd=测试通过;”;
cn.Open();
使用(OdbcCommand cmd=newodbccommand(“{BEGIN:=调用TESTUSER.TESTPKG.TESTFUNC(?,,,?);END;}”,conn))
{
cmd.CommandType=System.Data.CommandType.StoredProcess;
cmd.CommandText=“TESTUSER.TESTPKG.TESTFUNC”;
cmd.Parameters.Add(“PARAM1”,OdbcType.Decimal).Direction=System.Data.ParameterDirection.Input;
cmd.Parameters[“PARAM1”].Value=var1;
cmd.Parameters.Add(“PARAM2”,OdbcType.VarChar).Direction=System.Data.ParameterDirection.Output;
cmd.Parameters.Add(“PARAM3”,OdbcType.VarChar).Direction=System.Data.ParameterDirection.Output;
cmd.Parameters.Add(“PARAM4”,OdbcType.VarChar).Direction=System.Data.ParameterDirection.Output;
cmd.ExecuteNonQuery();
int.TryParse(cmd.Parameters[“PARAM2”].Value.ToString(),out var2);
uAcctStatus=cmd.Parameters[“PARAM3”].Value.ToString();
uReturnMsg=cmd.Parameters[“PARAM4”].Value.ToString();
}
cn.Close();
返回变量2;
这是我收到的错误信息:

异常:错误[42000][Microsoft][Oracle的ODBC驱动程序][Oracle]ORA-00900:无效的SQL语句
编辑:我已经测试了这个包和代码,它在ODAC/ODP.NET中工作,但是我被要求将它更改为另一台服务器的ODBC。对我来说,最麻烦的是:

OdbcCommand cmd=newodbccommand(“{BEGIN:=调用TESTUSER.TESTPKG.TESTFUNC(?,,,?);END;}”,conn)

终于让它开始工作了。我添加了每个参数的大小,并对调用进行了更正:函数有四个参数(1 in,3 out),没有返回值:

using (OdbcCommand cmd = conn.CreateCommand())
{
    cmd.CommandText = "{ CALL TESTUSER.TESTPKG.TESTFUNC(?,?,?,?) }";
    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    cmd.Parameters.Add("PARAM1", OdbcType.Decimal, 38).Direction = System.Data.ParameterDirection.Input;
    cmd.Parameters["PARAM1"].Value = var1;
    cmd.Parameters.Add("PARAM2", OdbcType.VarChar, 5).Direction = System.Data.ParameterDirection.Output;
    cmd.Parameters.Add("PARAM3", OdbcType.VarChar, 50).Direction = System.Data.ParameterDirection.Output;
    cmd.Parameters.Add("PARAM4", OdbcType.VarChar, 200).Direction = System.Data.ParameterDirection.Output;
    cmd.ExecuteNonQuery();

我还发现这个文档非常有用:

您确定
TestFunc
是一个函数,而不是一个过程吗?PL/SQL调用似乎表明它是一个过程,而不是一个函数,在这种情况下没有返回值。@我想你是对的。这只是我尝试过的几种无效语法组合之一。我知道这是一个函数,它接收四个参数并返回一个值。如果是这样,您的PL/SQL块应该会出错,因为您没有变量来存储函数返回的结果。如果不将返回值赋给某个对象,就不能在PL/SQL中调用函数。@我想将返回值存储在var2中;我在另一个环境中使用ODP.NET成功地做到了这一点,但是在这个服务器中我只能使用ODBCI,我认为您混淆了ODBC调用语法。移除BEGIN..CALL;结束;将其拆分或保留,并删除ODBC转义字符-{}。因此,请尝试“BEGIN:=TESTUSER.TESTPKG.TESTFUNC(?,,?,?);END;”或尝试“{?:=calltestuser.TESTPKG.TESTFUNC(?,,,?)}”