免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2246 | 回复: 0
打印 上一主题 下一主题

[求助] ora_sql_txt函数 内容有中文 可能会出现乱码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-14 13:38 |只看该作者 |倒序浏览
通过触发器 获取 DDL语句,如果获取的内容中包含中文,就会导致 出现乱码,示例如下:
  1. ---- 存储DDL语句的表
  2. create table sys.test_audit_ddl
  3. (opertime date,
  4. operation varchar2(30),
  5. object_type varchar2(30),
  6. object_name varchar2(30),
  7. sql_stmt varchar2(4000)
  8. );

  9. ---- 捕获DDL语句的触发器
  10. create or replace trigger sys.test_trg_audit_ddl
  11. before ddl on database
  12. declare
  13. pragma autonomous_transaction;
  14. n number;
  15. stmt varchar2(4000) :=null;
  16. sql_text ora_name_list_t;
  17. begin

  18. n := ora_sql_txt(sql_text);
  19. for i in 1..n loop
  20. stmt := stmt || sql_text(i);
  21. end loop;

  22. insert into sys.test_audit_ddl
  23. (
  24. opertime,operation,
  25. object_type,object_name,sql_stmt
  26. )
  27. values(
  28. sysdate,
  29. ora_sysevent,
  30. ora_dict_obj_type,
  31. ora_dict_obj_name,
  32. stmt
  33. );
  34. commit;
  35. end;
  36. /

  37. ---- 测试DDL捕获乱码的情形
  38. create or replace procedure test_proc as
  39. begin
  40. -- 这是一个测试中文DDL是否乱码的例子
  41. dbms_output.put_line('这是一个测试中文DDL是否乱码的过程');
  42. end;
  43. /

  44. create or replace procedure test_proc as
  45. begin
  46. --------------- 这是一个测试中文DDL是否乱码的例子
  47. dbms_output.put_line('这是一个测试中文DDL是否乱码的过程');
  48. end;
  49. /
复制代码
结果如下:
  1. 14:36:11 SQL> select * from sys.test_audit_ddl;

  2. OPERTIME OPERATION OBJECT_TYPE
  3. ------------------- ------------------------------ ------------------------------
  4. OBJECT_NAME
  5. ----------------------------------------
  6. SQL_STMT
  7. ---------------------------------------------------------------------------------------------------
  8. 2012-06-26 14:36:02 CREATE PROCEDURE
  9. TEST_PROC
  10. create or replace procedure test_proc as
  11. begin
  12. -- 这是一个测试中文DDL是否乱码的例子
  13. dbms_output.put_line('这是一个测试中文DDL是否乱码的过程');
  14. end;

  15. 2012-06-26 14:36:11 CREATE PROCEDURE
  16. TEST_PROC
  17. create or replace procedure test_proc as
  18. begin
  19. --------------- 这是一个测试中文DDL是否乱码的例子
  20. dbms_output.put_line('这是桓霾馐灾形腄DL是否乱码的过程');
  21. end;
复制代码
以上示例代码是从其他帖子 复制来的,不过和我遇到的问题是一摸一样的,自己也进行了验证,故就直接采用了。
(没有权限写URL地址,故没有贴出)

数据库版本:10.2.0.5

我的想法是 中文是占2个字符的,而在 dbms_standard.ora_name_list_t 这个函数将  获取的 内容 进行分割的时候,将一个中文给分割了,就导致分割之后的中文内容全部是乱码,
不知道有没有办法解决呢??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP