用于SYS_CONNECT_BY_PATH ORACLE sql的ASCII

时间:2013-12-18 10:35:24

标签: oracle

有没有办法在SYS_CONNECT_BY_PATH中使用ascii代码进行值分隔符。

例如SYS_CONNECT_BY_PATH(columnname,'!')

我想使用!(33)的ASCII值而不是实际符号。另外,我可以使用ENTER (13)的ascii值作为值分隔符吗?

谢谢。

2 个答案:

答案 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))

借用example from the manual

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”