oracle 语句重写,在Oracle10g中使用包DBMS_ADVANCED_REWRITE实现新的查询重写功能

从Oracle10g版本1开始,提供了新的包DBMS_ADVANCED_REWRITE来实现查询重写。它允许你截获特定的SQL语句,并将

其重定义为另一个SQL语句。下面是一个简单的例子:

1、确认测试用户有必要的权限去运行

CONN sys/password AS SYSDBA

GRANT EXECUTE ON DBMS_ADVANCED_REWRITE TO test;

GRANT CREATE MATERIALIZED VIEW TO test;

[@more@]

2、创建测试用表

CONN test/test

DROP TABLE rewrite_test_tab;

CREATE TABLE rewrite_test_tab (

id NUMBER,

description VARCHAR2(50),

CONSTRAINT rewrite_test_tab_pk PRIMARY KEY (id)

);

INSERT INTO rewrite_test_tab (id, description) VALUES (1, 'GLASGOW');

INSERT INTO rewrite_test_tab (id, description) VALUES (2, 'BIRMINGHAM');

INSERT INTO rewrite_test_tab (id, description) VALUES (3, 'LONDON');

COMMIT;

EXEC DBMS_STATS.gather_table_stats(USER, 'rewrite_test_tab');

3、查询测试表

SELECT * FROM rewrite_test_tab;

ID DESCRIPTION

---------- --------------------------------------------------

1 GLASGOW

2 BIRMINGHAM

3 LONDON

3 rows selected.

SQL>

4、创建要替换成的SQL使用的视图,然后将上面的语句重定义为查询这个视图

CREATE OR REPLACE VIEW rewrite_test_tab_v AS

SELECT id,

INITCAP(description) AS description

FROM rewrite_test_tab

ORDER BY description;

BEGIN

SYS.DBMS_ADVANCED_REWRITE.declare_rewrite_equivalence (

name => 'test_rewrite',

source_stmt => 'SELECT * FROM rewrite_test_tab',

destination_stmt => 'SELECT * FROM rewrite_test_tab_v',

validate => FALSE,

rewrite_mode => 'TEXT_MATCH');

END;

/

5、初始化参数QUERY_REWRITE_INTEGRITY缺省值为"enforced",意味只有原始语句的输出和替换后语句的输出完全

一致才会进行重写替换。而我们要实现替换后的输出跟原始输出是有差别的,所以需要将这个参数的值修改为

"TRUSTED"才行。

ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED;

Session altered.

SELECT * FROM rewrite_test_tab;

ID DESCRIPTION

---------- --------------------------------------------------

2 Birmingham

1 Glasgow

3 London

3 rows selected.

SQL>

6、视图[USER|ALL|DBA]_REWRITE_EQUIVALENCES中有这些重定义查询的相关信息

SELECT * FROM user_rewrite_equivalences;

OWNER NAME

------------------------------ ------------------------------

SOURCE_STMT

--------------------------------------------------------------------------------

DESTINATION_STMT REWRITE_MO

-------------------------------------------------------------------------------- ----------

TEST TEST_REWRITE

SELECT * FROM rewrite_test_tab

SELECT * FROM rewrite_test_tab_v TEXT_MATCH

1 row selected.

SQL>

更多的参考资料可见:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值