2

是否有高级 oracle 功能可以在将 SQL 查询提交到 oracle 之前对其进行修改?或者可能是修改结果集?基于一定的条件?Like 可能是基于提交查询的进程的名称?还是基于查询文本?

场景是一个进程(用 C++ 编写)正在运行一个查询,而我们没有办法更改 C++ 代码。该流程中的特定业务验证失败,为了使验证不会失败,我想要一种方法来处理返回的数据集或在将选择查询提交到 oracle 引擎之前对其进行操作。

C++ 代码正在运行这个精确的查询

从 A_HDR 中选择 PL_ID,其中 ENT_NBR=''

我想更改它,以便 ORACLE 总是看到并执行以下查询

从 A_HDR 中选择 NULL,其中 ENT_NBR=''

请指导

4

1 回答 1

2

Oracle 虚拟专用数据库可能正是您想要的。从手册:

Oracle 虚拟专用数据库 (VPD) 使您能够创建安全策略来控制行和列级别的数据库访问。从本质上讲,Oracle 虚拟私有数据库将动态 WHERE 子句添加到针对应用了 Oracle 虚拟私有数据库安全策略的表、视图或同义词发出的 SQL 语句。

您可以从SYS_CONTEXT获取流程和查询文本。例如,sys_context('userenv', 'current_sql')sys_context('userenv', 'module')。您可能还需要使用GV$SESSION来获取更多信息。

但是,我认为您应该尽可能避免使用 VPD。让所有 SQL 语句在后台静默转换是非常令人困惑的。它会使开发和故障排除变得非常困难。


更新

Oracle 12c 中的SQL Translation Framework特性可能是解决这个问题的最佳方案。

于 2012-10-18T04:18:53.333 回答