写好的存储过程编译通过了,但测试的时候出错了
执行到一个select xxx1 into xxx2 from xxx3 where xxx4=xxx5;的语句时,抛出异常结束。
xxx2是我定义的变量,xxx5是输入参数
我在该存储过程中有3个这样连续的语句,第一个语句通过了,第二个语句抛出异常,但查看变量xxx2的值,已经设进去了。这3条语句单独拿出来按照select xxx1 from xxx3 where xxx4=常量的形式执行都正确,说明我的sql语句没有问题这3条语句中只有一条在测试存储过程时是没错的,其他两条总是抛出异常,无论他们怎么样的顺序排列后来,我写一个最简单的存储过程,里面就是有问题的一条sql语句,测试时,提示我:实际返回的行数超出请求的行数
可是,我单独执行这个查询语句查询出来的就只有一行啊,怎么会超出请求行数呢?

解决方案 »

  1.   

    检查变量xxx5的名称是否和表中其中一个字段名相同。如果是这样,语法解释时不把它认为是传参而认为是字段名,不会返回你要的结果。如果不是这个原因,可以将该过程改成匿名过程,方便调试的找出错误所在
      

  2.   

    是同名的,但这个是可以的吧,编译没有报错,而且,测试的时候,我查看了xxx5的值,就是我传进来的值匿名过程?就是Declare....Begin.....end;?
      

  3.   

    如果你的变量名和字段名一致的话。在sql里的时候,会先有些把这个变量名解析为那个字段名。如果你这里xxx4=xxx5 其中xxx5当作字段名查询时能查出多条记录的话,select into就会出错了,into只能对应一个结果集
      

  4.   

    是不是有空值呀? 先count下
      

  5.   

    “如果你的变量名和字段名一致的话。在sql里的时候,会先有些把这个变量名解析为那个字段名。 如果你这里xxx4=xxx5 其中xxx5当作字段名查询时能查出多条记录的话,select into就会出错了,into只能对应一个结果集”
    我的那张表就两个字段,一共就3条数据,很简单,应该不会查出多条记录(而且3条记录都不重复)吧,明天去公司再看看
      

  6.   

    “引用楼主 canghaiguzhou 的回复:
    可是,我单独执行这个查询语句查询出来的就只有一行啊,怎么会超出请求行数呢? 
    是不是有空值呀? 先count下”
    1.空值不显示么?也就是说,即使我看到的是显示一行,也不一定就真的是一行么?
    2.我在网上查,有说加上rownum=1的条件就可以的,明天回公司试一试
      

  7.   

    SQL> select * from test;
     
    DUMMY
    -----
    X
    a
     
    SQL> select count(*) from test;
     
      COUNT(*)
    ----------
             3你把空值过滤掉就OK了
      

  8.   

    对,是declare..end
    测试的时候怎么测的?在过程里查询语句使用变量时,注意不要和字段名重名。编译是不会报错的,因为这不是语法问题,是逻辑问题