我查询了两个表中的两个值,我想把两个值相除得到一个新值,但是总是报错,如下:
newpar:=newpar+par1/par2;
其中par1,par2是查询出的结果number类型,newpar是我定义的一个其他值也是number类型,但总是提示:
错误:PLS-00306: 调用 '/' 时参数个数或类型错误
错误:PL/SQL: Statement ignored
帮我看一下是什么问题啊。

解决方案 »

  1.   

    par2是否允许为0或空值????
      

  2.   

    把你的SP貼出來吧,不然不清楚你如何寫的,看不出錯誤的
    給你個沒錯的例子create or replace procedure testp
    is
        par1 number;
    par2 number;
    newpar number := 100;
    begin
    select 100,200 into par1,par2 from dual;
    newpar:=newpar+par1/par2;
    dbms_output.put_line(newpar);
    exception
    when others then
    dbms_output.put_line('errors');
    end;
    /
    set serveroutput on;
    exec testp;
      

  3.   

    可以尝试这样改一下 select to_number(par1) into par1 from tab1;select to_number(par2) into par2 from tab2;然后在编译试一下  应该是隐性类型转换的问题
      

  4.   


    create or replace procedure selinfo(inum in number,outpar1 out number)
    is
    par1 number;
    par2 number;
    newpar number:=0;
    rnum number:=0;
    str varchar2(2000);
    type cur_3 is ref cursor;
    recur cur_3;
    begin
    str:='select t1.s1,t2.s1 from table1 t1 join table2 t2 on t1.id=t2.id order by t1.id asc';
    open recur for str;
    fetch recur into par1,par2;
    while recur%found loop
    if(par1>0 and pr2>0) then
    newpar:=newpar+par1/par2;(就是报的这里的错)
    rnum:=rnum+1;
    end if;
    fetch recur into par1,par2;
    end loop;
    outpar1:=newpar/rnum;
    end selinfo;查询的两个字段都是非空的,只是有可能为0。
      

  5.   

    做一下处理NVL(t1.s1,0),NVL(t2.s1,0) 或者不用写存储过程 用SQL实现SELECT SUM(S1/S2)/COUNT(1) FROM (SELECT NVL(T1.S1,0) AS S1,NVL(T2.S1,0) AS S2 FROM TABLE1 T1 JOIN TABLE2 T2 ON T1.ID=T2.ID) WHERE S1>0 AND S2>0;
      

  6.   


    if(par1>0 and pr2>0) then--應是par2
    --但改後此點執行沒有錯create table table1(
    id int,
    s1 number
    );
    create table table2(
    id int,
    s1 number
    );insert into table1 values(1,2);
    insert into table2 values(1,3);
    insert into table2 values(1,0);SQL> declare
      2   outpar1 number;
      3  begin
      4   selinfo(0,outpar1);
      5   dbms_output.put_line(outpar1);
      6  end;
      7  /
    .6666666666666666666666666666666666666667                                       已順利完成 PL/SQL 程序.
      

  7.   

    如果不把if(par1>0 and pr2>0) then 改为if(pr2>0) then,你那里执行有错没有?因为我实际上也是不想要par1=0的数据.
    还有我在编译的时候就有错误,这种能调试不?
      

  8.   

    我去掉/,直接让newpar:=newpar+par1或者newpar:=newpar+par2都没错,唯独newpar:=newpar+par1/pr2它说参数个数或者类型错误。
      

  9.   

    现在好了,我重新定义一个变量par3:=par1/par2,然后再newpar:=newpar+par3,居然行了。
    谢谢大家的解答啊,尤其是人生无悔。