12
返回列表 发新帖
楼主: 1ITPUB1111

新手第一次在itpub提问:重新编译有什么用啊?!总想不明白,请大家指点一下!!谢谢

[复制链接]
论坛徽章:
0
11#
 楼主| 发表于 2004-12-16 11:01 | 只看该作者
不好意思,我的意思是我插入一条记录,a的值是'asdfasfasfasd', 调用时报数据不匹配错,

不是这个错,大家应该能明白我的意思吧~
ERROR 位于第 1 行:
ORA-01403: 未找到数据
ORA-06512: 在"SCOTT.TEST_PROC", line 5
ORA-06512: 在line 1

使用道具 举报

回复
论坛徽章:
0
12#
 楼主| 发表于 2004-12-16 11:01 | 只看该作者
TEST2:

SQL> create table test(a number(20));

表已创建。

SQL>
SQL> create or replace procedure test_proc
  2    as
  3       v number;
  4       begin
  5       select a into v from test;
  6       end;
  7
  8  /

过程已创建。

SQL> alter table test modify(a varchar(20))
  2  /

表已更改。

SQL> alter procedure test_proc compile;

过程已更改。(重新编译了而不报错??我试了把表删掉,再重新编译才报错,怎么解释呢?)

SQL> show err
没有错误。

使用道具 举报

回复
论坛徽章:
0
13#
 楼主| 发表于 2004-12-16 11:19 | 只看该作者
又想了一会,如果子程序所依赖的对象失效后,对相关子程序的重新编译的作用为:
1,可以发现现在的子程序是否有错,(比如表被删掉肯定报错)以便于程序员修改
2,编译好后,再调用就不用编译了,速度快

我对自己上面测试所说问题的理解为:
存储过程是在
create or replace后被编译的
之所以编译时没报错,是因为那个错(select a(字符型) into v(数值型) from test;)不属于编译时错误
而属于运行时错误,所以调用时才出错
是这样的吗?

使用道具 举报

回复
论坛徽章:
168
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:49:54蜘蛛蛋
日期:2011-12-05 16:08:56ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41设计板块每日发贴之星
日期:2011-07-22 01:01:02ITPUB官方微博粉丝徽章
日期:2011-06-30 12:30:16管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
14#
发表于 2004-12-16 11:40 | 只看该作者
对于select a(字符型) into v(数值型) from test;语句
oracle会执行强制类型转换,如果转换不成功即报错.(这个跟编译没有关系了).
另外,在变更表结构后不编译存储过程也可以运行,原因是执行时oracle会自动编译.
看如下实验,
SQL>
SQL> drop table test
  2  /

表已丢弃。

已用时间:  00: 00: 00.00
SQL> create table test(a number(20))
  2  /

表已创建。

已用时间:  00: 00: 00.00
SQL>
SQL> create or replace procedure test_proc
  2  as
  3  v number;
  4  begin
  5  select a into v from test;
  6  end;
  7  /

过程已创建。

已用时间:  00: 00: 00.00
SQL> alter table test modify(a varchar(20))
  2  /

表已更改。

已用时间:  00: 00: 00.00
SQL> alter procedure test_proc compile
  2  /

过程已更改。

已用时间:  00: 00: 00.00
SQL> insert into test values(1)
  2  /

已创建 1 行。

已用时间:  00: 00: 00.00
SQL> commit
  2  /

提交完成。

已用时间:  00: 00: 00.00
SQL> exec test_proc

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.00
SQL> /

提交完成。

已用时间:  00: 00: 00.00
SQL> delete test
  2  /

已删除 1 行。

已用时间:  00: 00: 00.00
SQL> insert into test values('abc')
  2  /

已创建 1 行。

已用时间:  00: 00: 00.00
SQL> commit
  2  /

提交完成。

已用时间:  00: 00: 00.00
SQL> exec test_proc
BEGIN test_proc; END;

*
ERROR 位于第 1 行:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "TEST.TEST_PROC", line 5
ORA-06512: at line 1


已用时间:  00: 00: 00.00
SQL> /

提交完成。

已用时间:  00: 00: 00.00
SQL>
SQL> delete test
  2  /

已删除 1 行。

已用时间:  00: 00: 00.00
SQL> commit
  2  /

提交完成。

已用时间:  00: 00: 00.00
SQL> alter table test modify(a varchar(30))
  2  /

表已更改。

已用时间:  00: 00: 00.00
SQL> insert into test values(1)
  2  /

已创建 1 行。

已用时间:  00: 00: 00.00
SQL> commit
  2  /

提交完成。

已用时间:  00: 00: 00.00
SQL> exec test_proc

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.00
SQL> /

提交完成。

已用时间:  00: 00: 00.00

使用道具 举报

回复
论坛徽章:
0
15#
 楼主| 发表于 2004-12-16 15:27 | 只看该作者
谢谢斑竹了,辛苦了!你的签名也狠好,向你学习!
基本明白了,现在剩最后一个基础问题了,
create or replace创建存储过程时是直接编译了吧,编译时只考虑语法错误吗?看下面的测试,是怎么个道理?
(这里的人真好~比csdn好)


SQL> create or replace procedure test_proc
  2   as
  3   v number;
  4   v1 int;
  5   begin
  6   --select a into v from test;
  7   v:='asdfasdgfdhfgfhffhf';
  8   v1:='asdfadsfasdfafda';
  9   end;
10  /

过程已创建。(这样也成?)

SQL> execute test_proc(调用时才出错,怎么个道理)
BEGIN test_proc; END;

*
ERROR 位于第 1 行:
ORA-06502: PL/SQL: 数字或值错误 :  字符到数值的转换错误
ORA-06512: 在"SCOTT.TEST_PROC", line 7
ORA-06512: 在line 1

使用道具 举报

回复
论坛徽章:
0
16#
 楼主| 发表于 2004-12-16 19:04 | 只看该作者
估计斑竹下班了
: )

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
17#
发表于 2004-12-16 23:08 | 只看该作者
最初由 1ITPUB1111 发布
[B]谢谢斑竹了,辛苦了!你的签名也狠好,向你学习!
基本明白了,现在剩最后一个基础问题了,
create or replace创建存储过程时是直接编译了吧,编译时只考虑语法错误吗?看下面的测试,是怎么个道理?
(这里的人真好~比csdn好)


SQL> create or replace procedure test_proc
  2   as
  3   v number;
  4   v1 int;
  5   begin
  6   --select a into v from test;
  7   v:='asdfasdgfdhfgfhffhf';
  8   v1:='asdfadsfasdfafda';
  9   end;
10  /

过程已创建。(这样也成?)

SQL> execute test_proc(调用时才出错,怎么个道理)
BEGIN test_proc; END;

*
ERROR 位于第 1 行:
ORA-06502: PL/SQL: 数字或值错误 :  字符到数值的转换错误
ORA-06512: 在"SCOTT.TEST_PROC", line 7
ORA-06512: 在line 1 [/B]



编译的时候并不执行,oracle应该是没有校验等式右边的值到底是不是匹配。

使用道具 举报

回复
论坛徽章:
168
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:49:54蜘蛛蛋
日期:2011-12-05 16:08:56ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41设计板块每日发贴之星
日期:2011-07-22 01:01:02ITPUB官方微博粉丝徽章
日期:2011-06-30 12:30:16管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
18#
发表于 2004-12-17 08:59 | 只看该作者
最初由 1ITPUB1111 发布
[B]谢谢斑竹了,辛苦了!你的签名也狠好,向你学习!
基本明白了,现在剩最后一个基础问题了,
create or replace创建存储过程时是直接编译了吧,编译时只考虑语法错误吗?看下面的测试,是怎么个道理?
(这里的人真好~比csdn好)


SQL> create or replace procedure test_proc
  2   as
  3   v number;
  4   v1 int;
  5   begin
  6   --select a into v from test;
  7   v:='asdfasdgfdhfgfhffhf';
  8   v1:='asdfadsfasdfafda';
  9   end;
10  /

过程已创建。(这样也成?)

SQL> execute test_proc(调用时才出错,怎么个道理)
BEGIN test_proc; END;

*
ERROR 位于第 1 行:
ORA-06502: PL/SQL: 数字或值错误 :  字符到数值的转换错误
ORA-06512: 在"SCOTT.TEST_PROC", line 7
ORA-06512: 在line 1 [/B]


oracle判断不出‘’里面的到底是数字还是非数字,要到运行时才能判断。这就是所谓的运行时错误了。
如果你熟悉java的话,这样的情况应该是会经常碰到的。

使用道具 举报

回复
论坛徽章:
0
19#
 楼主| 发表于 2004-12-17 22:51 | 只看该作者
在大家的无私帮助下终于彻底搞明白了这个问题

有这样的版主,有这样的用户,itpub一定会走的更远

谢谢~~

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表