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

标签 c# .net oracle odbc package

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

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

这是包结构:

DECLARE 

  PARAM1 NUMBER; --in
  PARAM2 VARCHAR2(200); --out
  PARAM3 VARCHAR2(200); --out
  PARAM4 VARCHAR2(200); --out

BEGIN

  PARAM1 := 123;
  PARAM2 := NULL;
  PARAM3 := NULL;
  PARAM4 := NULL;

TESTUSER.TESTPKG.TESTFUNC(PARAM1, PARAM2, PARAM3, PARAM4);

  DBMS_OUTPUT.Put_Line(PARAM2);
  DBMS_OUTPUT.Put_Line(PARAM3);
  DBMS_OUTPUT.Put_Line(PARAM4);

COMMIT;
END;

这就是我调用包的方式:

string var1 = "123";
int var2;

OdbcConnection cn = new OdbcConnection("Driver={Microsoft ODBC for Oracle};Server=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=TESTHOST)(PORT=1234))(CONNECT_DATA=(SID=TESTSID)));Uid=TESTUSER;Pwd=TESTPASS;");
cn.Open();

using (OdbcCommand cmd = new OdbcCommand("{ BEGIN ? := CALL TESTUSER.TESTPKG.TESTFUNC(?,?,?,?); END; }", conn))
{
    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    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();
return var2;

这是我收到的错误消息:

Exception: ERROR [42000] [Microsoft][ODBC driver for Oracle][Oracle]ORA-00900: invalid SQL statement

编辑:我已经测试了包和代码,它可以在 ODAC/ODP.NET 中运行,但有人要求我将其更改为另一台服务器的 ODBC。对我来说麻烦的部分是:

OdbcCommand cmd = new OdbcCommand("{ BEGIN ? := CALL TESTUSER.TESTPKG.TESTFUNC(?,?,?,?); END; }", conn)

最佳答案

终于可以用了。我添加了每个参数的大小并对调用进行了更正:该函数有四个参数(1 个输入,3 个输出)并且没有返回值:

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();

我还发现此文档非常有帮助:Using the Oracle ODBC Drivers with Third Party Products

关于c# - 尝试在 C# 中使用 ODBC 调用 Oracle 包时出现语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18837539/

相关文章:

c# - 为什么 IList 不支持 AddRange

c# - 在 NuGet 配置中使用环境变量?

.net - MVVM 场景中的报表查看器 (rdcl)

.net - Windows服务无法复制到文件共享

sql - Oracle SQL 开发人员 : If Exists Update Else Insert Missing Right Parenthesis Compiler Error

java - 持久的数据库更改通知

c# - 在 C# 上使用数组初始化语法初始化 Dictionary 实例时,幕后会发生什么?

c# - 将 ReadAsStreamAsync 与 StreamReader 一起使用时出现 "stream was not readable"ArgumentException

python - 使用 SQL 创建 Oracle 数据库表到另一个 Oracle 数据库的副本

c# - XmlSerializer 生成没有命名空间前缀的 XML