SQL Developer 脚本输出截断 sys_refcursor 宽度
Posted
技术标签:
【中文标题】SQL Developer 脚本输出截断 sys_refcursor 宽度【英文标题】:SQL Developer script output truncates sys_refcursor width 【发布时间】:2014-11-18 23:19:21 【问题描述】:我定义了一个函数,它返回一个包含 5 个文本列的 sys_refcursor。对不起,出于商业原因,我不能在这里发布它的内容。这些列被转换为具有特定宽度 (9,4,10,10,10) 的 varchar2。铸造使我能够确保列宽是恒定的。
在 SQL Developer 1.5 中,打印脚本输出(使用 SQL 工作表中的 F5)将光标的内容很好地显示为:
MY_FUNCTION(input1,input2,input3)
---------------------------------
COLUMN1 COLU COLUMN3 COLUMN4 COLUMN5
--------- ---- ---------- ---------- ----------
18-NOV-14 TEXT SOME_DATA1 SOME_DATA2 SOME_DATA3
18-NOV-14 TEXT SOME_DATA1 SOME_DATA2 SOME_DATA3
18-NOV-14 TEXT SOME_DATA1 SOME_DATA2 SOME_DATA3
18-NOV-14 TEXT SOME_DATA1 SOME_DATA2 SOME_DATA3
但是,在 SQL Developer 4.0 中,输出在函数调用的宽度处包装(类似于 SQLPlus 的 linesize 参数):
MY_FUNCTION(input1,input2,input3)
---------------------------------
COLUMN1 COLU COLUMN3 COLUMN4
COLUMN5
--------- ---- ---------- -------
--- ----------
18-NOV-14 TEXT SOME_DATA1 SOME_DA
TA2 SOME_DATA3
18-NOV-14 TEXT SOME_DATA1 SOME_DA
TA2 SOME_DATA3
18-NOV-14 TEXT SOME_DATA1 SOME_DA
TA2 SOME_DATA3
18-NOV-14 TEXT SOME_DATA1 SOME_DA
TA2 SOME_DATA3
数据库版本为 11g。我尝试使用“set linesize 1000”命令,但输出仍然以相同的长度换行。但是,将 linesize 设置为 5 会导致它在 5 个字符处换行。
在不使用任何“set”命令的情况下,SQL*Plus 中的输出显示正常。
有没有办法在 4.0 中防止光标内容的换行?
【问题讨论】:
我只看到如果我将 ref 光标作为选择列表的一部分返回;如果我将函数值分配给refcursor
变量,然后分配给print
,它会按预期显示。你在做什么?如果您正在选择,作为一种解决方法,您是否可以只使用大尺寸的column
命令,如果您可以在查询中为列设置别名,这会更容易吗?
对列进行别名肯定是一种选择,所以我会尝试使用列格式。我以为是 SQLPlus 命令,所以没试过。
【参考方案1】:
不直接回答问题 - 我不知道为什么行为不同或如何在从查询中调用函数时更改它,除了使用 column
命令设置宽度,在此处使用别名稍微简化一下:
set lines 250
column rc format a250
select my_function(input1,input2,input3) as rc from dual;
但是你也可以通过不同的调用函数来得到你想要的输出;带有一个变量和一个匿名块(或execute
作为简写):
variable rc refcursor;
exec :rc := MY_FUNCTION(input1,input2,input3);
print rc
嗯,几乎如你所愿;输出的第一行是变量名而不是函数/参数列表;但光标列未换行:
anonymous block completed
RC
---------------------------------------------------------------------------
COLUMN1 COLUMN2 COLUMN3 COLUMN4 COLUMN5
------------------------- ------- ---------- ---------- ----------
18-NOV-14 text some_data1 some_data2 some_data3
您还可以从代码编辑器(而不是工作表)运行您的函数,它会为您生成一个匿名块;当您单击运行箭头(或按 control-F10)时,您会看到如下对话框:
运行它后,您会在主窗口底部看到一个“输出变量”选项卡,该选项卡在网格中显示光标输出。
您还可以在运行select my_function(...) from dual
时看到网格视图。光标进入正常的“查询结果”窗口,但不是很友好,显示如下:
<COLUMN1=19-NOV-14,COLUMN2=text,COLUMN3=some_data1,COLUMN4=some_data2,COLUMN5=some_data3>,
但是,如果您双击一个值,您会在该列的最右侧看到一个黄色铅笔符号,单击该符号会在其自己的网格中显示该光标。
我个人更喜欢脚本输出中的print
选项,但我很少使用网格显示。
【讨论】:
感谢您的选择。下次有能力的时候我会给他们一个机会。我在其他页面上阅读过有关“输出变量”选项卡的信息,但似乎永远无法让它出现,显然使用代码编辑器视图是关键。希望这很容易,因为匿名 block / exec 方法需要更多地记住语法,因此我不太可能即时回忆它。以上是关于SQL Developer 脚本输出截断 sys_refcursor 宽度的主要内容,如果未能解决你的问题,请参考以下文章
SQL Developer:从 SQL 脚本输出中删除科学记数法?
Oracle SQL FGA sys_context('userenv','current_sql') 被截断
如何在 SQL Developer 中的 PLSQL 错误后抑制脚本显示(禁用命令/代码输出)