我正在尝试使用ODBC和C#来使用Oracle 9i包。我尝试使用here,here,here和here中描述的语法,但我似乎无法做到正确。
注意 :我不允许在这种特殊情况下使用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)
答案 0 :(得分:2)
终于开始工作了。我添加了每个参数的大小并对调用进行了更正:该函数有四个参数(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