我正在使用oracle 11g.我的存储过程是返回varchar2,但它的值被oracle客户端截断.
以下是我的代码:
以下是我的代码:
if ((ds != null) && (ds.Tables.Count > 0)) { foreach (DataRow rw in ds.Tables[0].Rows) { OracleParameter param = new OracleParameter((rw["argument_name"]).ToString(),GetOracleType(rw["data_type"].ToString().ToUpper())); param.Direction = GetParameterDirection((rw["in_out"]).ToString().ToUpper()); discoveryCommand.Parameters.Add(param); if (param.Direction == ParameterDirection.Output && param.OracleType == OracleType.VarChar) { param.Size = 4000; } } }
我将param.size增加到4000,但是值被截断.
是否有任何解决方案.在服务器上我有Oracle 12c.我需要获得解决方案,而不会在我的项目中更新oracle客户端版本,因为某些原因是不允许的.
以下是SP.我修改它返回硬编码的值.还是一样的问题
PROCEDURE access_level ( p_emp_id IN employees.emp_id%TYPE,p_id IN NUMBER,p_type VARCHAR2,p_access_level OUT VARCHAR2 ) IS BEGIN p_access_level := 'X' || 'RO' || 'RW'; END IF;
解决方法
对于连接到服务器12.1.0.1.0的客户端版本11.2.0.1.0,我无法重现您的问题.当Oracle 12c客户端截断输出变量时,这是一个
known case,但是如果您使用11g版本的客户端,则不应该是这样.
我使用了以下测试表和存储过程:
CREATE TABLE TEST_TABLE ( ID NUMBER(11) NOT NULL,NAME VARCHAR2(256),CONSTRAINT TEST_TABLE_PK PRIMARY KEY (ID) ) / INSERT INTO TEST_TABLE(ID,NAME) VALUES(1,'Some test data') / CREATE PROCEDURE TEST_PROCEDURE ( P_ID OUT NUMBER,P_NAME OUT VARCHAR2 ) AS BEGIN SELECT ID,NAME INTO P_ID,P_NAME FROM TEST_TABLE; END;
using (OracleConnection connection = new OracleConnection()) { connection.ConnectionString = ConfigurationManager.ConnectionStrings["TestDatabase"].ConnectionString; connection.Open(); using (OracleCommand command = connection.CreateCommand()) { command.CommandText = "TEST_PROCEDURE"; command.CommandType = CommandType.StoredProcedure; OracleParameter param1 = new OracleParameter("P_ID",OracleType.Number); param1.Direction = ParameterDirection.Output; command.Parameters.Add(param1); OracleParameter param2 = new OracleParameter("P_NAME",OracleType.VarChar); param2.Size = 4000; param2.Direction = ParameterDirection.Output; command.Parameters.Add(param2); using (command.ExecuteReader()) { Console.WriteLine($"Output: [{param2.Value}]"); } } }
要继续您的问题,请您执行以下操作:
>如果可以创建上面的测试表和存储过程,并检查如何使用上述代码获取字符串数据.
>如果由于某种原因不可能,请提供以下信息:
>调用存储过程的完整代码
>所有从事存储过程的表的DDL
>获取数据的完整客户端代码
恶魔总是在细节.我们应该明白你的情况与上面的示例代码的区别.