本人刚学PL/SQL编程,刚买了本书《Oracle9i PL_SQL从入门到精通》,刚看到第二章,这是书上的一个实例,
我都原样打的,都执行不了,刚学就杯具了,纠结了好久,发帖求助。
create table test_table(ncolumn number,vcolumn varchar2(30)); /*创建test_table表*/DECLARE
v_num1 number:=1;
v_num2 number:=2;
v_str1 varchar2(30):='hello';
v_str2 varchar2(30):='第一个次接触PL/SQL';
v_OutputStr varchar2(30);
begin
insert into test_table(ncolumn,vcolumn) values(v_num1,v_str1);
insert into test_table(ncolumn,vcolumn) values(v_num2,v_str2);
select vcolumn into v_OutputStr from test_table where ncolumn=v_num1;
dbms_output.put_line(v_OutputStr);
select vcolumn into v_OutputStr from test_table where ncolumn=v_num2;
dbms_output.put_line(v_OutputStr);
end;
执行出错
*
ERROR 位于第 1 行:
ORA-01422: 实际返回的行数超出请求的行数
ORA-06512: 在line 10
SQL> create table test_table(ncolumn number,vcolumn varchar2(30)); 表已创建。SQL> DECLARE
2 v_num1 number:=1;
3 v_num2 number:=2;
4 v_str1 varchar2(30):='hello';
5 v_str2 varchar2(30):='第一个次接触PL/SQL';
6 v_OutputStr varchar2(30);
7 begin
8 insert into test_table(ncolumn,vcolumn) values(v_num1,v_str1);
9 insert into test_table(ncolumn,vcolumn) values(v_num2,v_str2);
10 select vcolumn into v_OutputStr from test_table where ncolumn=v_num1;
11 dbms_output.put_line(v_OutputStr);
12 select vcolumn into v_OutputStr from test_table where ncolumn=v_num2;
13 dbms_output.put_line(v_OutputStr);
14 end;
15
16 /PL/SQL 过程已成功完成。
SQL> select * from test_table; NCOLUMN VCOLUMN
---------- ------------------------------
1 hello
2 第一个次接触PL/SQL
select vcolumn from test_table where ncolumn=1;
SQL> edi
已写入 file afiedt.buf 1 DECLARE
2 n1 number;
3 n2 number;
4 v_num1 number:=1;
5 v_num2 number:=2;
6 v_str1 varchar2(30):='hello';
7 v_str2 varchar2(30):='第一个次接触PL/SQL';
8 v_OutputStr varchar2(30);
9 begin
10 insert into test_table(ncolumn,vcolumn) values(v_num1,v_str1);
11 insert into test_table(ncolumn,vcolumn) values(v_num2,v_str2);
12 commit;-----注意看这里
13 select vcolumn into v_OutputStr from test_table where ncolumn=v_num1;
14 dbms_output.put_line(v_OutputStr);
15 select vcolumn into v_OutputStr from test_table where ncolumn=v_num2;
16 dbms_output.put_line(v_OutputStr);
17* end;
18 /
hello
第一个次接触PL/SQLPL/SQL 过程已成功完成。
---------- ---------------------
1 hello
2 第一个次接触PL/SQLSQL> 只有一条记录
你现在的表里有两条记录了
再执行insert into test_table(ncolumn,vcolumn) values(v_num1,v_str1);
insert into test_table(ncolumn,vcolumn) values(v_num2,v_str2);
就有4条记录了,而且是有两两重复的
也就是说 你的这个过程只能执行一次 以后都会报错的
SQL> create table test_table(ncolumn number,vcolumn varchar2(30));表已创建。SQL> DECLARE
2 v_num1 number:=1;
3 v_num2 number:=2;
4 v_str1 varchar2(30):='hello';
5 v_str2 varchar2(30):='第一个次接触PL/SQL';
6 v_OutputStr varchar2(30);
7 begin
8 insert into test_table(ncolumn,vcolumn) values(v_num1,v_str1);
9 insert into test_table(ncolumn,vcolumn) values(v_num2,v_str2);
10 select vcolumn into v_OutputStr from test_table where ncolumn=v_num1;
11 dbms_output.put_line(v_OutputStr);
12 select vcolumn into v_OutputStr from test_table where ncolumn=v_num2;
13 dbms_output.put_line(v_OutputStr);
14 end;
15
16 /PL/SQL 过程已成功完成。--上面是第一次执行,没问题
SQL> / --这个是第二次执行就有问题了 因为已经有相同的记录了
DECLARE
*
第 1 行出现错误:
ORA-01422: 实际返回的行数超出请求的行数
ORA-06512: 在 line 10
DECLARE
v_num1 number:=1;
v_num2 number:=2;
v_str1 varchar2(30):='hello';
v_str2 varchar2(30):='第一个次接触PL/SQL';
v_OutputStr varchar2(30);
begin
execute immediate 'delete test_table'; --先删除表里的记录
insert into test_table(ncolumn,vcolumn) values(v_num1,v_str1);
insert into test_table(ncolumn,vcolumn) values(v_num2,v_str2);
commit;
select vcolumn into v_OutputStr from test_table where ncolumn=v_num1;
dbms_output.put_line(v_OutputStr);
select vcolumn into v_OutputStr from test_table where ncolumn=v_num2;
dbms_output.put_line(v_OutputStr);
end;
/
怪了,我改成你那样的,还是不行。我是实验环境是oracle9I版本。一直提示:实际返回的行数超出请求的行数