c# – 存储过程OUTPUT VARCHAR2值使用12c客户端截断
发布时间:2020-12-15 06:20:21 所属栏目:百科 来源:网络整理
导读:我正在使用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
我正在使用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,但是值被截断. 以下是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}]"); } } } 要继续您的问题,请您执行以下操作: >如果可以创建上面的测试表和存储过程,并检查如何使用上述代码获取字符串数据. >调用存储过程的完整代码 恶魔总是在细节.我们应该明白你的情况与上面的示例代码的区别. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |