本人刚学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

解决方案 »

  1.   

    --完全复制你的 没问题啊
    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
      

  2.   

    --估计是你表里还有其他数据,也就是说你下面的语句查出来不只一条记录
    select vcolumn from test_table where ncolumn=1;
      

  3.   


    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 过程已成功完成。
      

  4.   

    select   into 如果有多行记录,就会报错!
      

  5.   

    SQL> select * from test_table;   NCOLUMN VCOLUMN
    ---------- ---------------------
             1 hello
             2 第一个次接触PL/SQLSQL> 只有一条记录
      

  6.   

    你的这个表没有主键吧?
    你现在的表里有两条记录了
    再执行insert into test_table(ncolumn,vcolumn) values(v_num1,v_str1);
    insert into test_table(ncolumn,vcolumn) values(v_num2,v_str2);
    就有4条记录了,而且是有两两重复的
    也就是说 你的这个过程只能执行一次 以后都会报错的
      

  7.   


    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
      

  8.   


    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;
    /
      

  9.   


    怪了,我改成你那样的,还是不行。我是实验环境是oracle9I版本。一直提示:实际返回的行数超出请求的行数