【问题标题】:Oracle SQLPlus setting environment variable based on variableOracle SQLPlus 根据变量设置环境变量
【发布时间】:2010-10-27 05:08:18
【问题描述】:

我想根据我要检索的 XML 数据的大小设置环境变量 long。这个想法是这样的:

var XML_DATA_SIZE number;

SELECT TRIM(LENGTH(xmltype.getClobVal(xml_data))) 
  INTO :XML_data_size 
  FROM xml_tab 
 WHERE key = '1234';

print XML_DATA_SIZE
set long XML_DATA_SIZE
set pagesize 0
set line 2000

set termout off
spool XMLDATA.xml
select xml_data from xml_tab where key = '1234';
spool off

这会产生错误:SP2-0268: long option not a valid number,并且 XML 文件仅包含 80 个字符。

【问题讨论】:

  • 为什么不直接把它调到最大不用担心呢?
  • @Adam Hawkes:根据我的阅读,如果我将long 设置为可能的最大值,客户端将需要那么多可用内存,即使我返回的实际数据要小得多.我预计不需要最大可能,但我非常不愿意猜测实际的最大值。在测试数据中,示例 XML 文档从 20 KB 到 3000 KB 不等,这只是非常简单的测试数据。
  • 嗯,这将是一个问题。我很确定限制是 200 万字节。所以这 3000K 消息将被切断。在客户端上分配 2MB 的 RAM 对我来说似乎没什么大不了的。
  • @Adam Hawkes:好吧,如果他们想要的数据太大,嗯……我想他们将不得不回去做任何他们想做的事情。 ;) 据我所见,这不会是他们想要查看的大部分数据。从我在这里读到的download.oracle.com/docs/cd/B19306_01/server.102/b14357/…The maximum value of *n* is 2,000,000,000 bytes.
  • 哇,是的,我错了 1000 倍。20 亿,而不是 200 万。

标签: oracle sqlplus


【解决方案1】:

代替

set long XML_DATA_SIZE

试试

set long &XML_DATA_SIZE

[编辑]:

抱歉,我摆弄了一些其他选项,这些选项搞砸了我的测试。 试试这个:

define xml_data_size=0
column xml_data_size new_value xml_data_size noprint

select trim(length(xmltype.getClobVal(xml_data))) xml_data_size from xml_tab where key = '1234';

set long &xml_data_size
sho long
set pagesize 0
...
...

【讨论】:

  • 如果您已经将其设置为一个值,则不会。它在 SQL*Plus 中对我有用
  • 我试过了,它提示我。我可以输入print 语句给我的数字,一切正常,但我最终想把它交给分析师,他们将在批处理模式下运行它并使用生成的文件。
  • @OMG Ponies - 你是对的,我的错!我无意中尝试了其他一些实际上最终可以工作的东西,但我的原始答案弄乱了我的测试用例
  • 不,对我来说,我需要绑定变量上的 : 前缀(否则我会收到 missing keyword 错误)。另外,我收到一个错误saying SP2-0267: long option 0 out of range (1 through...
  • 哦,等等,如果它是一列我不需要into。没关系,这确实工作! :) :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 2014-12-17
  • 1970-01-01
  • 2018-07-13
  • 2014-09-29
  • 1970-01-01
  • 2014-09-24
相关资源
最近更新 更多