|
|
对于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 |
|