时间: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的语句!!
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_ADVANCED_REWRITE');
DBMS_ADVANCED_REWRITE.DECLARE_REWRITE_EQUIVALENCE(
'TEST_REWRITE',
NULL, //原始查询语句
'ROWNUMBER[(]/ROW_NUMBER(', //目标语句
FALSE,
'TEXT_MATCH'
);
SELECT * FROM SYS_REWRITE_EQUIVALENCES;
ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED;
SP_USER_SET_AUTO_REWRITE_FLAG ('SYSDBA', 1);
验证正常:
延申:
实际v$sessions里面和sqllog里面记录的都已经是替换之后的语句了
如果有地方可以查到哪些语句命中了这个匹配规则就好了。
文章
阅读量
获赞