【发布时间】:2012-10-03 08:31:30
【问题描述】:
我有一个 clob 变量,需要将它分配给 varchar2 变量。 clob var里面的数据小于4000(即varchar2的maxsize)oracle10+
我试过了
report_len := length(report_clob);
report := TO_CHAR(dbms_lob.substr(report_clob, report_len, 1 ));
report_clob := null;
但它会将报告变成我在调试时看到的长值。另外,当我从我的 C# 代码中调用这个 sql (proc) 时。它抱怨说缓冲区太小,因为我按照 varchar 发送参数,但上面的转换可能会将它变成长值。
我什至尝试过直接分配
report_clob := report
得到相同的结果。
编辑
好的,要回答以下问题,请参阅: 我在 PL/SQL 开发人员中使用测试脚本进行调试。报告变量是 varchar2(4000)。当我在第二行之后。报告显示是一个长期值,它只是说 (Long Value) 。连内容都看不到。
report 和 report_clob 是过程中的变量。这个过程是从 C# 代码中调用的。
当我调用此过程时,C# 中有一个异常字符串缓冲区太小。我在 C# 中给出了 5000 作为报告变量的大小,足以从过程中接收 4000 个最大字符值。所以我想问题不在于那里。
当我分配 report:= 'some string....' 然后 C# 调用工作正常。
所以我的调查表明,report := transform (report_clob) 正在使报告变成长值或一些类似的东西(奇怪),这使得 C# 代码在处理 5000 varchar out 参数中的更大值时出现问题。
我很乐意提供更多细节。
【问题讨论】:
-
report是如何声明的?LONG还是VARCHAR2?你是如何调试的,你是如何将值返回到c#- 函数返回或输出参数,那是什么类型? -
report := CAST(report_clob AS VARCHAR2(3999)); -
DBMS_LOB.substr返回一个 VARCHAR2,你不需要TO_CHAR函数。还有什么叫长值?你如何调试?您到底得到了什么消息错误(即 Oracle 或 C#)?报表变量是如何声明的? -
请在我的问题编辑区查看更新