有没有办法在SYS_CONNECT_BY_PATH
中使用ascii代码进行值分隔符。
例如SYS_CONNECT_BY_PATH(columnname,'!')
,
我想使用!(33)
的ASCII值而不是实际符号。另外,我可以使用ENTER (13)
的ascii值作为值分隔符吗?
谢谢。
答案 0 :(得分:0)
您可以使用chr
function将字符替换为等效的数字。
SYS_CONNECT_BY_PATH(column name, chr(33))
或者使用换行符,也应该没问题:
SYS_CONNECT_BY_PATH(column name, chr(13))
它不是严格的ASCII,因为它取决于你的字符集,但它可能适合你。您可以使用反向ascii
function来查看数值,这也不是非常相当的ASCII,但是再次非常接近,特别是如果您总是使用相同的字符集。因此ascii('!')
会为您提供33
。
正如您所发现的那样,除了固定的字符串文字外,任何其他内容都会给出:
SQL Error: ORA-30003: illegal parameter in SYS_CONNECT_BY_PATH function 30003. 00000 - "illegal parameter in SYS_CONNECT_BY_PATH function" *Cause: *Action: use a non-empty constant string as the second argument, then retry the operation.
这就是为什么我经常在发布之前测试一下,但这看起来很简单......你可以用replace
来解决这个问题:
REPLACE(SYS_CONNECT_BY_PATH(column name, '/'), '/', chr(33))
SELECT LPAD(' ', 2*level-1)
||replace(SYS_CONNECT_BY_PATH(last_name, '/'),'/',chr(33)) "Path"
FROM employees
START WITH last_name = 'Kochhar'
CONNECT BY PRIOR employee_id = manager_id;
Path
--------------------------------------------------
!Kochhar
!Kochhar!Greenberg
!Kochhar!Greenberg!Faviet
!Kochhar!Greenberg!Chen
!Kochhar!Greenberg!Sciarra
!Kochhar!Greenberg!Urman
!Kochhar!Greenberg!Popp
!Kochhar!Whalen
!Kochhar!Mavris
!Kochhar!Baer
!Kochhar!Higgins
!Kochhar!Higgins!Gietz
答案 1 :(得分:0)
所有的功劳都归功于Sanjeev Chauhan。更新7/25/2017:结果是SQL Developer 4.2.0和17.2.0错误。在SQLPlus和SQL Developer 3.2.2中,该语句工作正常。 修复:关闭secureliterals;
来源为https://community.oracle.com/thread/4065282
我已将版本从4.2.0更改为4.1.1.19,我的代码工作正常。另请注意,我在版本4.2.0中找不到“secureliterals”