如何从 oracle pl sql 中的包主体内的 select 语句中捕获特定列
Posted
技术标签:
【中文标题】如何从 oracle pl sql 中的包主体内的 select 语句中捕获特定列【英文标题】:How to capture particular column from select statement inside a package body in oracle pl sql 【发布时间】:2016-01-15 07:33:17 【问题描述】:我在这样的数据库包体中有超过 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 语句中。我该如何应对?
【问题讨论】:
包这么大,不是一次性的任务吗?我的意思是用手做可能更容易 这行不通? select * from user_source where name ='pk_name' and TRIM(TEXT) like '%case%' and TRIM(TEXT) like '%then%' ..? 为什么10个包都不能直接写case语句?正则表达式需要什么? @agent5566:是的,上面只是一个示例,根据我的计算,包真的很大,我需要 11 个小时才能手动完成。 @moudiz 我需要完整的逻辑而不是单行,这就是为什么我想使用逗号作为分隔符,无论行数如何,它都会获得值。 【参考方案1】:一般情况下,RegExp 不适用于此任务。您应该处理不规则的 SQL DML 语法(我不是在谈论 pl\sql lang 假设我们已经从包中删除了查询。我相信可以使用 PLscope 和 RegExp)。所以你必须做出选择:
实现或采用一些完整 SQL 语法解析器并做你想做的事
采取一些限制您的任务的假设,简化 SQL 语法并使其正规子集。例如,您可以说列表达式不能有子查询等等。然后你就可以使用正则表达式了。
制作一些简单且更通用的 CFG,其中 SQL 是其子集。然后实现简单的 CFG 解析器(手动或使用工具 yacc\bison)
至于我,我更喜欢第三种情况。但如果你不熟悉所有这些东西,你可能需要 11 个多小时才能完成某件事。
【讨论】:
以上是关于如何从 oracle pl sql 中的包主体内的 select 语句中捕获特定列的主要内容,如果未能解决你的问题,请参考以下文章
如何从 R 调用存储在 Oracle 数据库中的 PL/SQL 过程
如何从 Oracle PL/SQL 函数中返回现有表中的记录?
如何从 11g Oracle (PL/SQL) 上的 URL 传递凭据和下载文件?