- 论坛徽章:
- 0
|
通过触发器 获取 DDL语句,如果获取的内容中包含中文,就会导致 出现乱码,示例如下:- ---- 存储DDL语句的表
- create table sys.test_audit_ddl
- (opertime date,
- operation varchar2(30),
- object_type varchar2(30),
- object_name varchar2(30),
- sql_stmt varchar2(4000)
- );
- ---- 捕获DDL语句的触发器
- create or replace trigger sys.test_trg_audit_ddl
- before ddl on database
- declare
- pragma autonomous_transaction;
- n number;
- stmt varchar2(4000) :=null;
- sql_text ora_name_list_t;
- begin
- n := ora_sql_txt(sql_text);
- for i in 1..n loop
- stmt := stmt || sql_text(i);
- end loop;
- insert into sys.test_audit_ddl
- (
- opertime,operation,
- object_type,object_name,sql_stmt
- )
- values(
- sysdate,
- ora_sysevent,
- ora_dict_obj_type,
- ora_dict_obj_name,
- stmt
- );
- commit;
- end;
- /
- ---- 测试DDL捕获乱码的情形
- create or replace procedure test_proc as
- begin
- -- 这是一个测试中文DDL是否乱码的例子
- dbms_output.put_line('这是一个测试中文DDL是否乱码的过程');
- end;
- /
- create or replace procedure test_proc as
- begin
- --------------- 这是一个测试中文DDL是否乱码的例子
- dbms_output.put_line('这是一个测试中文DDL是否乱码的过程');
- end;
- /
复制代码 结果如下:- 14:36:11 SQL> select * from sys.test_audit_ddl;
- OPERTIME OPERATION OBJECT_TYPE
- ------------------- ------------------------------ ------------------------------
- OBJECT_NAME
- ----------------------------------------
- SQL_STMT
- ---------------------------------------------------------------------------------------------------
- 2012-06-26 14:36:02 CREATE PROCEDURE
- TEST_PROC
- create or replace procedure test_proc as
- begin
- -- 这是一个测试中文DDL是否乱码的例子
- dbms_output.put_line('这是一个测试中文DDL是否乱码的过程');
- end;
- 2012-06-26 14:36:11 CREATE PROCEDURE
- TEST_PROC
- create or replace procedure test_proc as
- begin
- --------------- 这是一个测试中文DDL是否乱码的例子
- dbms_output.put_line('这是桓霾馐灾形腄DL是否乱码的过程');
- end;
复制代码 以上示例代码是从其他帖子 复制来的,不过和我遇到的问题是一摸一样的,自己也进行了验证,故就直接采用了。
(没有权限写URL地址,故没有贴出)
数据库版本:10.2.0.5
我的想法是 中文是占2个字符的,而在 dbms_standard.ora_name_list_t 这个函数将 获取的 内容 进行分割的时候,将一个中文给分割了,就导致分割之后的中文内容全部是乱码,
不知道有没有办法解决呢?? |
|