如何从 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 函数中返回现有表中的记录?

从 apex 页面进程调用 pl/sql 函数

如何从 11g Oracle (PL/SQL) 上的 URL 传递凭据和下载文件?

如何使用参数从 Oracle PL/SQL 执行 Java jar 文件?

Oracle 构建顺序和 PL/SQL 包依赖关系