oracle - 提交前更改 Oracle SQL 查询文本

标签 oracle plsql oracle10g oracle11g

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

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

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

从 A_HDR WHERE ENT_NBR='' 中选择 PL_ID

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

从 A_HDR WHERE ENT_NBR='' 中选择 NULL

请指导

最佳答案

Oracle Virtual Private Database可能就是您正在寻找的。来自手册:

Oracle Virtual Private Database (VPD) enables you to create security policies to control database access at the row and column level. Essentially, Oracle Virtual Private Database adds a dynamic WHERE clause to a SQL statement that is issued against the table, view, or synonym to which an Oracle Virtual Private Database security policy was applied.

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

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


更新

SQL Translation Framework Oracle 12c 中的功能可能是解决此问题的最佳解决方案。

关于oracle - 提交前更改 Oracle SQL 查询文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12945957/

相关文章:

sql - 识别单行子查询错误

oracle - 将 0 和 1 的数组转换为 base36 字符串

apache - Oracle HTTP Server (OHS) Apache 2.2.13 Poodle SSLv3 修复?

oracle - 更改Oracle中列的数据类型

java - 如何向数据库中插入百万条数据

oracle - tomcat 6 dbcp 和 oracle 11 瘦驱动程序的堆空间不足

Oracle存储过程-根据可选参数动态生成选择语句

oracle - "Missing ( keyword"在Oracle 12c中创建具有列标识的表时

oracle - 错误地违反了 PL/SQL Pragma

sql - oracle在选择内部调用存储过程