ado.net oracle存储过程输出varchar参数split-cut被截断

本文关键字:split-cut 参数 varchar net oracle 存储过程 输出 ado | 更新日期: 2023-09-27 18:29:10

我有一个Oracle存储过程(SP),它返回一个varchar参数,但当我执行SP并尝试读取输出时,字符串会被剪切。当我在Toad上执行SP并生成dbms.output时,字符串会很好地返回。

procedure testStringOutput(num in number, str out varchar2)
as
V_C NUMBER(38);
V_E VARCHAR2(2000);
begin
    select '12345678910111213141516171819PPPPPPPPPPPPPPPPPPPPPPPPP'
    into str
    FROM DUAL;
exception
when others then
V_C := SQLCODE;
V_E:= SQLERRM;
dbms_output.put_line(V_C||'-> '||V_E);
end;

我将SP称为脚本的方式:

declare
P2 VARCHAR2(2000) :='';
begin
PKGTEST.TESTSTRINGOUTPUT(1,P2);
dbms_output.put_line('output string - > '||P2);
end;

输出:

output string - > 12345678910111213141516171819PPPPPPPPPPPPPPPPPPPPPPPPP

从c#调用SP的方式:

public void TestOutputString()
{
    string str = string.Empty;
    using (connection)
    {
        OracleCommand objCmd = new OracleCommand();
        objCmd.Connection = connection;
        objCmd.CommandText = "PKGTEST.testStringOutput";
        objCmd.CommandType = CommandType.StoredProcedure;
        objCmd.Parameters.Add("num", OracleType.Number).Value = 0;
        objCmd.Parameters.Add("str", OracleType.VarChar, 2000).Direction = ParameterDirection.Output;
        foreach (OracleParameter parameter in objCmd.Parameters)
            if (parameter.Value == null)
                parameter.Value = DBNull.Value;
        try
        {
            connection.Open();
            objCmd.ExecuteNonQuery();
            str = (objCmd.Parameters["str"].Value.ToString());
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        connection.Close();
    }
}

但当我检查响应字符串时,它被拆分,直到123456789101112131415161718,另一部分(19PPPPPPPPPPPPPPPPPPPPPPPPP)丢失。请参阅此图像。

我做错了什么?

更新:我确信发生了,SP向WCF服务返回消息,但当客户端收到响应时,它被拆分了。

ado.net oracle存储过程输出varchar参数split-cut被截断

最后,我不得不使用Oracle数据提供程序odp.net,而不是ado.net-System.data.OracleClient(已弃用),它可以工作。