注册
DBMS_ADVANCED_REWRITE的一个使用示例
专栏/问一忘二三/ 文章详情 /

DBMS_ADVANCED_REWRITE的一个使用示例

哈哈 2024/06/12 1042 4 0
摘要 在不改变应用程序的前提下,在服务器端将查询语句替换成其他的查询语句执行的一种手段。 !!应急用可以,不建议当作常规手段。

时间:2024年6月12日


背景:不支持ROWNUMBER() OVER( ORDER BY XXX) 分析函数,应使用row_number

1.创建表 create table test(id int,tname varchar(10)); 2.插入数据 insert into TEST SELECT LEVEL,'A'||LEVEL FROM DUAL CONNECT BY LEVEL<1000; commit; 3.查询 SELECT ROW_NUMBER() OVER(ORDER BY ID DESC),* FROM TEST; 4.修改为ROWNUMBER报错"不支持的分析函数" SELECT ROWNUMBER() OVER(ORDER BY ID DESC),* FROM TEST;

可以使用DBMS_ADVANCED_REWRITE系统包暂时绕过,详细用法参考系统包使用手册
注意:正则匹配需要考虑是否会影响到其他不想被rewrite的语句!!

  1. 创建系统包

SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_ADVANCED_REWRITE');

  1. 设置重写规则
DBMS_ADVANCED_REWRITE.DECLARE_REWRITE_EQUIVALENCE( 'TEST_REWRITE', NULL, //原始查询语句 'ROWNUMBER[(]/ROW_NUMBER(', //目标语句 FALSE, 'TEXT_MATCH' );
  1. 查看已存在的重写规则

SELECT * FROM SYS_REWRITE_EQUIVALENCES;
image.png

  1. 设置当前会话重写规则生效,并验证重写后的语句是否符合预期

ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED;

  1. 设置自动重写,让指定用户可以自动调用重写规则,而不必设置会话级生效

SP_USER_SET_AUTO_REWRITE_FLAG ('SYSDBA', 1);

验证正常:
image.png

延申:
实际v$sessions里面和sqllog里面记录的都已经是替换之后的语句了
image.png
image.png

如果有地方可以查到哪些语句命中了这个匹配规则就好了。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服