[20181015]12C SQL Translation Framework.txt

--//12c提供一个dba改写sql语句的可能性,实际上10g,11g之前也有一个包DBMS_ADVANCED_REWRITE能实现类似的功能.
--//这种功能实在是一种旁门左道,还是测试看看.

--//不过如果程序存在大量的执行错误,一样会影响性能,导致出现SQL*Net break/reset to client.
--//参考连接:0624使用10035事件跟踪无法执行的sql语句 =>http://blog.itpub.net/267265/viewspace-2120884/
--//http://www.itpub.net/thread-2061952-1-1.html

1.环境:
SCOTT@test01p> @ ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.2.0.1.0     Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production              0

2.测试:

begin
   dbms_sql_translator.create_profile('test_profile');
   dbms_sql_translator.register_sql_translation( profile_name => 'test_profile',
                                                 sql_text => 'select sysdate',
                                                 translated_text => 'SELECT SYSDATE FROM DUAL');
end;
/
--//注sql_text可以写不对,但是前面一定开始是select,不然sqlplus无法识别是sql语句.

SCOTT@test01p> alter session set sql_translation_profile=test_profile;
Session altered.

SCOTT@test01p> alter session set events = '10601 trace name context forever, level 32';
Session altered.

D:\tools\rlwrap>oerr ora 10601
10601, 00000, "turn on debugging for cursor_sharing (literal replacement)"
// *Cause:
// *Action:

SCOTT@test01p> select sysdate;
SYSDATE
-------------------
2018-10-15 20:24:21

SCOTT@test01p> Select sysdate;
Select sysdate
             *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected
--//一定要与原来文本一样.

--//刷新共享池问题:

SCOTT@test01p> alter system flush shared_pool;
System altered.

SCOTT@test01p> select sysdate;
SYSDATE
-------------------
2018-10-15 20:27:07

SCOTT@test01p> SELECT INVALID SELECT STATEMENT TO FORCE ODBC DRIVER TO UNPREPARED STATE;
D
-
X

SYS@test> alter system flush shared_pool;
System altered.

SCOTT@test01p> select sysdate;
SYSDATE
-------------------
2018-10-15 20:27:50

--//我记忆里早期12.1.0.1版本刷新共享池后执行会报错.12cR2版本修复这个错误.

3.看看记录在那些表中,如何删除等等操作.

--//涉及视图:
DBA_ERROR_TRANSLATIONS
DBA_SQL_TRANSLATION_PROFILES
DBA_SQL_TRANSLATIONS

SCOTT@test01p> @ pt2 'select * from DBA_SQL_TRANSLATIONS where PROFILE_NAME=''TEST_PROFILE''';
   ROW_NUM    COL_NUM COL_NAME             COL_VALUE
---------- ---------- -------------------- -------------------------------------------------------------
         1          1 OWNER                SCOTT
                    2 PROFILE_NAME         TEST_PROFILE
                    3 SQL_TEXT             select sysdate
                    4 TRANSLATED_TEXT      SELECT SYSDATE FROM DUAL
                    5 SQL_ID               bw2c1d6sqyjpy
                    6 HASH_VALUE           2976859838
                    7 ENABLED              TRUE
                    8 REGISTRATION_TIME    2018-10-15 20:23:15.415000
8 rows selected.

SYS@test> @ sharepool/shp4 bw2c1d6sqyjpy 0
TEXT           KGLHDADR         KGLHDPAR         C40            KGLHDLMD   KGLHDPMD   KGLHDIVC KGLOBHD0         KGLOBHD6           KGLOBHS0   KGLOBHS6   KGLOBT16   N0_6_16        N20   KGLNAHSH KGLOBT03        KGLOBT09
-------------- ---------------- ---------------- -------------- -------- ---------- ---------- ---------------- ---------------- ---------- ---------- ---------- --------- ---------- ---------- ------------- ----------
父游标句柄地址 000007FF130DCBC8 000007FF130DCBC8 select sysdate        1          0          0 00               00                        0          0          0         0          0 2327677740 bw2c1d6sqyjpy          0
--//看到一个很奇怪的父游标句柄,没有子游标,而且父游标的堆0是0.

--//如果还有一些语句还可以加入:
BEGIN
   dbms_sql_translator.register_sql_translation
   (
      profile_name      => 'test_profile'
     ,sql_text          => 'select user'
     ,translated_text   => 'SELECT usera FROM DUAL'
   );
END;
/

SCOTT@test01p> select user;
USER
--------------------
SCOTT

--//删除执行如下:
SCOTT@test01p> exec dbms_sql_translator.drop_profile(profile_name => 'test_profile');
PL/SQL procedure successfully completed.

SCOTT@test01p> select sysdate;
select sysdate
             *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected

SCOTT@test01p> @ pt2 'select * from DBA_SQL_TRANSLATIONS where PROFILE_NAME=''TEST_PROFILE''';
no rows selected

4.顺便看看这个包dbms_sql_translator的其它功能:

--//可以使用它计算sql_id:
SCOTT@test01p> select dbms_sql_translator.SQL_ID('select sysdate') c20  from dual ;
C20
--------------------
bw2c1d6sqyjpy

--//和前面的能对上.

SCOTT@test01p> set linesize 100
SCOTT@test01p> DECLARE
  2    content CLOB;
  3  BEGIN
  4      DBMS_SQL_TRANSLATOR.EXPORT_PROFILE(
  5        profile_name    =>  'ODBC_PROFILE',
  6        content         =>  content);
  7        dbms_output.put_line(content);
  8  END;
  9  /
<SQLTranslationProfile ForeignSQLSyntax="TRUE" TranslateNewSQL="TRUE" RaiseTranslationError="FALSE"
LogTranslationError="FALSE" TraceTranslation="FALSE" LogErrors="FALSE"
Editionable="TRUE"><SQLTranslations><SQLTranslation Enabled="TRUE"><SQLText>SELECT INVALID SELECT
STATEMENT TO FORCE ODBC DRIVER TO UNPREPARED STATE</SQLText><TranslatedText>SELECT DUMMY FROM
DUAL</TranslatedText><RegistrationTime>2018-10-13T21:02:21.964000</RegistrationTime></SQLTranslation
></SQLTranslations><ErrorTranslations></ErrorTranslations></SQLTranslationProfile>

PL/SQL procedure successfully completed.

[20181015]12C SQL Translation Framework.txt的更多相关文章

  1. [20181225]12CR2 SQL Plan Directives.txt

    [20181225]12CR2 SQL Plan Directives.txt --//12C引入SQL PLAN Directives.12cR1版本会造成大量的动态取样,影响性能.许多人把OPTI ...

  2. [20181105]再论12c set feedback only.txt

    [20181105]再论12c set feedback only.txt --//前一阵子的测试,链接:http://blog.itpub.net/267265/viewspace-2216290/ ...

  3. [20181015]为什么是3秒.txt

    [20181015]为什么是3秒.txt --//以前测试:连接http://blog.itpub.net/267265/viewspace-2144765/=>为什么是12秒.txt.--// ...

  4. [20181007]12cR2 Using SQL Patch 2.txt

    [20181007]12cR2 Using SQL Patch 2.txt --//12cR2 已经把sql打补丁集成进入dbms_sqldiag,不是11g的 DBMS_SQLDIAG_INTERN ...

  5. [20180914]oracle 12c 表 full_hash_value如何计算.txt

    [20180914]oracle 12c 表 full_hash_value如何计算.txt --//昨天在12c下看表full_hash_value与11g的full_hash_value不同,不过 ...

  6. [20170603]12c Top Frequency histogram.txt

    ---恢复内容开始--- [20170603]12c Top Frequency histogram.txt --//个人对直方图了解很少,以前2种直方图类型对于目前的许多应用来讲已经足够,或者讲遇到 ...

  7. Oracle 12c SQL Developer连接报错(ORA-12505)

    Oracle 12c SQL Developer连接报错(ORA-12505) 连接时报错码:Listener refused the connection with following error: ...

  8. sql 读取本地txt文件批量插入数据库

    --导入 INSERT INTO [netmonsdb].[dbo].[keywordlist]([keyword]) SELECT * FROM OPENROWSET( BULK 'D:/xmsys ...

  9. 20181015记录一个简单的TXT日志类

    20190422添加换行以及时间记录 using System; using System.Collections.Generic; using System.IO; using System.Lin ...

随机推荐

  1. IT十年经典书籍

    摘自网络,近来在浏览时,发现一个叫做“IT十年经典书籍”的主题.google了一下,实在找不出这个主题的源头出处.不过这个主题中所涉及的每一本书讲出来都是振聋发聩的,大可以作为它那个行业的经典了.  ...

  2. 前端JS 与 后台C# 之间JSON序列化与反序列化(笔记)

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.   在 前端浏览器 和 后端服务器 之间通常会使用 JSON格式的数据 来进行数据交互,而JSON格式的 ...

  3. Netty源码分析(五):EventLoop

    上一篇主要介绍了一下EventLoopGroup,本篇详细看下它的成员EventLoop. 类结构 NioEventLoop继承自SingleThreadEventLoop,而SingleThread ...

  4. SpringMVC学习(三)———— springmvc的数据校验的实现

    一.什么是数据校验? 这个比较好理解,就是用来验证客户输入的数据是否合法,比如客户登录时,用户名不能为空,或者不能超出指定长度等要求,这就叫做数据校验. 数据校验分为客户端校验和服务端校验 客户端校验 ...

  5. Hibernate学习(七)———— hibernate中查询方式详解

    序言 之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西.就是因为缺少总结.在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等 --WH 一.hibernate中的5种 ...

  6. openssl enc(对称加密)

    openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 对称加密工具.了解对称加密的原理后就很简单了,原理部分见下文. openss ...

  7. SpringBoot之Swagger2的使用

    Swagger是一组围绕OpenAPI规范构建的开源工具,可帮助设计.构建.记录和使用REST API.简单说下,它的出现就是为了方便进行测试后台的restful形式的接口,实现动态的更新,当我们在后 ...

  8. zabbix实现QQ邮件报警通知--技术流ken

    前言 前几天搜了下网上使用zabbix邮件报警通知的文章,大多数还是使用mailx的方法,过程配置起来比较冗余繁琐,这几天想着把自己平时用到的qq邮件报警的方法分享出来供大家参考,以此减少不必要的步骤 ...

  9. 实战!基于lamp安装Discuz论坛-技术流ken

    简介 我前面的博客已经详细介绍了lamp采用yum安装以及编译安装的方式,这篇博客将基于yum安装的lamp架构来实战安装Discuz论坛,你可以任选其一来完成. 系统环境 centos7.5 服务器 ...

  10. Spring Boot中如何扩展XML请求和响应的支持

    在之前的所有Spring Boot教程中,我们都只提到和用到了针对HTML和JSON格式的请求与响应处理.那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式 ...