【问题标题】:COMMA_TO_TABLE input value itself has Comma. comma-separated list invalid near pe(c_COMMA_TO_TABLE 输入值本身有逗号。 pe(c_) 附近的逗号分隔列表无效
【发布时间】:2018-03-07 12:03:39
【问题描述】:

任何人都可以帮助我解决以下问题。以下是我的要求。

我的表格格式:

101    a
102    b
103    c
104    data_get.cust_val(data_get.cust_val(val_2),emp_id)
105    d

dbms_utility.comma_to_table
   ( list   => regexp_replace('100,a,101,b,103,c,104,data_get.cust_val(data_get.cust_val(val_2),emp_id),105,d','(^|,)','\1X')
   , tablen => l_count
   , tab    => l_array
   );

当前没有占用 104 值,因为对应的值在 COMMA (,) 内部,代码也考虑了这一点。如何排除这些字符值集继续下一个COMMA (,)

错误:逗号分隔的列表在 al(d_..) 附近无效。

【问题讨论】:

  • COMMA_TO_TABLE 是一个用于解析数据库标识符列表的过程。试图以这种方式使用它只是公然滥用,应以失败作为惩罚。不要试图修复它;你将无法做到。您需要一种通用的方法来解析任意逗号分隔的字符串。然后:没有任何实用程序可以像您一样使用输入字符串。如果逗号是分隔符,那么值中的任何“文字”逗号都必须通过 some 机制进行转义。这不是解析器,any 解析器可以解决的问题;它必须在源头固定。

标签: sql oracle plsql


【解决方案1】:

100data_get.cust_val(data_get.cust_val(val_2),emp_id) 之类的值不是 valid Oracle identifier namesdbms_utility.comma_to_table 旨在解析这些值。它们不能以数字开头、包含括号、超过 30 个字符等。

你的regexp_replace 变成了这个字符串

100,a,101,b,103,c,104,data_get.cust_val(data_get.cust_val(val_2),emp_id),105,d

进入

X100,Xa,X101,Xb,X103,Xc,X104,Xdata_get.cust_val(data_get.cust_val(val_2),Xemp_id),X105,Xd

处理数字名称,但第 8 项仍然不是有效标识符。

如果您尝试将逗号分隔的字符串解析为数组,则需要编写自己的实用程序。

【讨论】:

  • 我想我需要重新表述我的问题。它不是标识符。我的 REGEXP_REPLACE 将我的输入字符串转换为 .. X100,Xa,X101,Xb,X103,Xc,X104,Xdata_get.cust_val(data_get.cust_val(val_2),emp_id),X105,Xd......... IT不应该考虑这个值里面的逗号.. data_get.cust_val(data_get.cust_val(val_2),emp_id)...你能帮忙如何组合模式来执行这样的操作吗?
  • “组合模式”是指“编写函数”吗?您无法使用 dbms_utility.comma_to_table 或任何其他 Oracle 内置工具来执行此操作。
  • 也许问题应该更像“如何解析这个逗号分隔的字符串”而不是“dbms_utility.comma_to_table 不起作用”。
猜你喜欢
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多