动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Oracle教程 ]的信息

本月文章推荐
.用PL/SQL产生随机数.
.使用Oracle 8.0数据库的几点经验.
.Oracle几种系统实用工具的详细介.
.Oracle 9i 分析函数参考手册.
.oracle里的常用命令.
.怎样在Oracle 10g存储过程中log错.
.实现数据仓库的upsert.
.在报表视图中实现分类显示.
.oracle9.2在redhad2.1安装.
..net+oracle+crystalReports开发.
.DBA应当如何查看Oracle数据库连接.
.调试程序里的 NullPointerExcept.
.关于Oracle数据库中的N层认证具体.
.Oracle常见错误代码的分析与解决.
.Oracle分析函数学习笔记3.
.Oracle10g支持SQL正则表达式.
.Actualtests Oracle 1Z0-007 V04.
.Oracle9i初始化参数中文说明(8).
.oracle的数据分页查询.
.DNS配置问答集.

Oracle8i和9i中PLSQL程序的不同运行结果

发表日期:2008-2-9 |



  在把Oracle的数据库从8i升级到9i及以上的时候,一般认为原有的PLSQL程序应该完全兼容,即运行过程和运行结果完全一致。遗憾的是,事实并非如此,由于ORACLE PLSQL引擎的升级,它对某些代码解释做了更改,导致某些代码会有不同的运行结果。 各位在升级数据库时必须重视,否则将导致无法估量的损失和难以恢复的灾难。
  
  1, PLSQL表作为参数传递
  先看以下代码,在ORACLE 8i和9i中的运行结果。
  declare
  
  type test_rec is record
  (
  col_1 varchar2(100)
  );
  
  type test_tbl is table of test_rec index by binary_integer;
  
  l_tbl test_tbl;
  
  procedure change_value
  is
  begin
  l_tbl(1).col_1 := 'I am changed!';
  end;
  
  procedure sub_test(pi_str in varchar2)
  is
  begin
  dbms_output.put_line('before: 'pi_str);
  change_value;
  dbms_output.put_line('after : 'pi_str);
  end;
  
  begin
  
  l_tbl(1).col_1 := 'I am ok!';
  sub_test(l_tbl(1).col_1);
  
  exception
  when others then
  dbms_output.put_line(sqlerrm);
  end;
  示例代码非常简单,即将PLSQL表的某个成员变量当作参数给另一过程,此过程改变了原PLSQL表的值,但未改变传入参数的值(当然不能改,表示为IN的参数的值是不能改的),观看改变前后,传入参数的值在Oracle 8i和9i的变化:
  
  运行结果:
  Oracle 8i Oracle 9i
  before: I am ok! before: I am ok!
  after : I am ok! after : I am changed!
  
  显然运行结果不一样!在Oracle 8i中,传入参数的值在原PLSQL表的值改变前后未变化,而在Oracle 9i中,传入参数的值被改动了。
  
  Oracle给出的解释是:在Oracle 8i中,所有表示为IN的参数传递都是传值的,包括PLSQL表类型的参数。而到了Oracle 9i,他们觉得PLSQL表类型的参数传递应该传引用,在PLSQL引擎上做了这样的修改,而导致这个问题。
  
  我们往返忆以下,传值意味2个变量传递的是真实的数值,各自有不同的内存空间,相当于变量被拷贝了一份,各为其主,互不相干。传引用意味2个变量传递的是内存空间的地址,指向同一块内存空间,假如此内存空间里放的数值被改变了,那么2个变量的值都会被改变。
  
  了解问题产生的原因,回头再读前面的示例代码,就比较轻易理解了。同样的程序,在数据库升级后产生了不同的运行结果,这个问题的危险程度相信大家一定能明白,必须重视。
  
  2, PLSQL表类型返回值NO_DATA_FOUND意外
  看以下代码:
  DECLARE
  l_test VARCHAR2(10);
  type test_rec is record (col_a varchar2(100));
  
  TYPE test_tab IS TABLE OF test_rec INDEX BY BINARY_INTEGER;
  
  l_test_tab test_tab;
  
  FUNCTION return_tbl ( pi_dummy IN VARCHAR2 )
  RETURN test_tab
  IS
  l_tbl test_tab;
  BEGIN
  l_tbl.DELETE;
  l_tbl(1).col_a := 'I am ok!';
  RETURN l_tbl;
  EXCEPTION
  WHEN OTHERS THEN
  l_tbl.DELETE;
  RETURN l_tbl;
  END;
  BEGIN
  l_test_tab := return_tbl('');
  l_test := l_test_tab(1).col_a;
  DBMS_OUTPUT.PUT_LINE ( 'before: ' l_pol_num );
  
  l_test := return_tbl('')(1).col_a;
  DBMS_OUTPUT.PUT_LINE ( 'after : ' l_test );
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
  DBMS_OUTPUT.PUT_LINE ( 'NO_DATA_FOUND exception!' );
  END;
  
  这段代码意味某函数返回一个PLSQL表类型的值,然后不同的引用方式,在屏幕上显示。
  运行结果:
  Oracle 8i Oracle 9i
  before: I am ok! before: I am ok!
  after : I am ok! NO_DATA_FOUND exception!
  
  在Oracle 8i中,直接用函数名和下标访问PLSQL表的成员变量是合法的,但到了Oracle 9i,这种方式会导致一个运行期NO_DATA_FOUND意外,而产生不同的运行结果。

  
  这个问题Oracle没有给出严格解释,只是指出这样的方式不再合法而已。大家同样需要重视这个问题,以免掉入这个陷阱。
  
  数据库的升级导致PLSQL程序有不同的运行结果,这样的问题让人担忧,ORACLE的行事方式让人头疼。若有很多的FORM、REPORT和PLSQL存储过程,这个问题导致的代码检查修改和产生的工作量是非常巨大的,而且后期测试也需要消耗大量的资源。希望ORACLE以后不要再发生这样的事情,那真会伤了一直很信任你的粉丝们的心。
上一篇:Oracle 10G 最佳20位新特性:SQL Advisor 和 ADDM 人气:639
下一篇:“Snapshot too old” Detailed Explanation 人气:447
浏览全部Oracle教程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 Web Wiz Forums(论坛系统) v9.53
2008-10-7 HDWiki v4.0.1 bulid 081007 UTF
2008-10-7 迅易评选投票管理系统 v10.0
2008-10-7 HDWiki v4.0.1 bulid 081007 GBK
2008-10-7 Bitrac单用户博客 v1.14 bulid 0
2008-10-7 OpenX(广告管理系统) v2.6.2 多国
2008-10-7 乐铺网店系统免费普及版 v3.41
2008-9-29 酷狗音乐(原KuGoo)2008 v5.310 正
2008-9-29 QQTab 1.1
2008-9-29 网络传送带 Net Transport 2.64a
2008-9-29 谷歌金山词霸v1.8
2008-9-29 TweakVI 1.0 Build 1090
2008-9-29 ACDSee Pro 2.5 Build 333 汉化绿
2008-9-29 Winamp v5.541(2189) 周明波简体
2008-9-27 CCleaner 2.12.651
2008-9-27 Mozilla Thunderbird 2.0.0.17 英
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成