如何从oracle pl sql中的包体内的select语句中捕获特定列

时间:2016-01-15 07:33:18

标签: regex oracle plsql

我在这样的数据库包体中有10个以上的包。

package pk_name  body
insert into table 
(id,
name,
roll_no)
(select 
s.id id,
case when s.name in ('ad','gd') 
then 'sam'
else 'pam' end  name,
s.rid roll_no )

我需要捕获的是select子句

中的列逻辑

例如

我需要来自专栏的案例陈述 命名

case when s.name in ('ad','gd') 
then 'sam'
else 'pam' end 

我需要为所有列执行此操作。

我可以在user_source表中看到我的所有包。

我想过使用正则表达式,但我无法这样做。

如您所见,select子句中的逗号用逗号分隔(我想将它用作分隔符)但是也有可能在case语句中包含逗号。我该如何处理?

1 个答案:

答案 0 :(得分:0)

一般情况下,此任务不接受RegExp。您应该处理不常规的SQL DML语法(假设我们已经从包中删除了查询,我不会谈论pl \ sql lang。我相信它可以与PLscope和RegExp一起使用)。所以你必须做出选择:

  1. 实现或采用一些完整 SQL语法解析器并执行您想要的操作

  2. 采取一些限制任务的假设,并简化SQL语法并制作常规子集。例如,您可以说列表达式不能包含子查询,依此类推。然后你可以使用RegExp。

  3. 制作一些简单且更通用的CFG,其中SQL是子集。然后实现简单的CFG解析器(手工或使用工具yacc \ bison)

  4. 至于我,我更喜欢第三种情况。但是如果你不熟悉所有这些东西,那么你需要花费11个多小时才能做些什么。