ITPub博客

首页 > 数据库 > Oracle > [20220105]再论ORA-29275与toad 12.txt

[20220105]再论ORA-29275与toad 12.txt

原创 Oracle 作者:lfree 时间:2022-01-05 09:02:20 0 删除 编辑

[20220105]再论ORA-29275与toad 12.txt

--//以前的链接 [20131030]ORA-29275与toad 12.txt => http://blog.itpub.net/267265/viewspace-775364/
--//别人问当时出现版本是10g,为什么现在11g还是存在这个问题.实际上问题在于执行DBMS_APPLICATION_INFO.set_action截取了32各字
--//符.如果截取出现半个汉字,问题再现,我个人感觉目前toad 12版本无法解决这个问题,除非你修改一些视图定义,这样存在一些不必要
--//的风险.

1.环境:

SCOTT@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

2.测试:
SCOTT@book> @ desc_proc sys DBMS_APPLICATION_INFO set_action
INPUT OWNER PACKAGE_NAME OBJECT_NAME
sample : @desc_proc sys dbms_stats gather_%_stats

OWNER      PACKAGE_NAME          OBJECT_NAME                      SEQUENCE ARGUMENT_NAME                  DATA_TYPE                      IN_OUT    DEFAULTED
---------- --------------------- ------------------------------ ---------- ------------------------------ ------------------------------ --------- ----------
SYS        DBMS_APPLICATION_INFO SET_ACTION                              1 ACTION_NAME                    VARCHAR2                       IN        N

SCOTT@book> exec DBMS_APPLICATION_INFO.set_action('1234567890123456789012345678901234567890123456789012345678901文化');
PL/SQL procedure successfully completed.

SCOTT@book> select module,action,length(action) from v$session where substr(action,1,2)='12';
MODULE       ACTION                                                           LENGTH(ACTION)
------------ ---------------------------------------------------------------- --------------
SQL*Plus     12345678901234567890123456789012                                             32

--//实际上在11g下执行exec DBMS_APPLICATION_INFO.set_action时,仅仅截取32长度.
--//如果执行如下,这样"文"的字符一半被截取,
--//文 编码 cec4.

SCOTT@book> exec DBMS_APPLICATION_INFO.set_action('1234567890123456789012345678901文化');
PL/SQL procedure successfully completed.

SCOTT@book> select module,action,length(action) from v$session where substr(action,1,2)='12';
MODULE       ACTION                                                           LENGTH(ACTION)
------------ ---------------------------------------------------------------- --------------
SP2-0784: Invalid or incomplete character beginning 0xCE returned

--//0xCE的编码就是文的前半部分。

3.toad受影响的范围:
--//实际上不仅仅影响session browser,也应该sga trace模块一样受影响。实际上主要原因是许多视图定义支持varchar2(64),而
--//DBMS_APPLICATION_INFO.set_action没有更正过来。我个人也不知道什么好方法解决这个问题.

4.测试19c下情况:
SYS@127.0.0.1:17101/dyhis> @pr
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 19.0.0.0.0
BANNER                        : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.9.0.0.0
BANNER_LEGACY                 : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

SYS@127.0.0.1:17101/dyhis> exec DBMS_APPLICATION_INFO.set_action('1234567890123456789012345678901234567890123456789012345678901文化');
PL/SQL procedure successfully completed.

SYS@127.0.0.1:17101/dyhis> select module,action,length(action) from v$session where substr(action,1,2)='12';
MODULE       ACTION                                                           LENGTH(ACTION)
------------ ---------------------------------------------------------------- --------------
SQL*Plus     1234567890123456789012345678901234567890123456789012345678901文              63

--//可以看出19c已经修复了这个问题,不会出现半个汉字的情况,后面的LENGTH(ACTION)=63.
SYS@127.0.0.1:17101/dyhis> select length(substrb('1234567890123456789012345678901234567890123456789012345678901文化',1,64)) N10 from dual;
                  N10
---------------------
                   63

--//而11g下就存在问题。
SCOTT@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SCOTT@book> select length(substrb('1234567890123456789012345678901文化',1,32)) N10 from dual;
                  N10
---------------------
                   32


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2850687/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7970383