create or replace procedure li
(
myename varchar2(50),
myloc out dept.loc%type ,
mydname out scott.dept.dname%type
)
as
begin
       select loc,dname into myloc,mydname
       from scott.emp,scott.dept
       where emp.empno=dept.deptno and emp.ename=dept.dname;
end;
上面这个oracle过程是错的。
为什么把myname的类型改为scott.emp.ename%TYPE就对啦 。

解决方案 »

  1.   

    因为你把表emp里的dname字段的内容给变量mydname,所以dname字段的类型要和变量mydname的类型相
    匹配,可能最初你的dname字段类型和mydname类型不匹配造成的,
    当你改为scott.emp.ename%type,就把变量mydname设定成了emp表里ename字段类型,这样当然匹配了。
      

  2.   

    你写的过程很怪啊,(1)首先用into的话,还回的记录必须是一条,(2)where emp.empno=dept.deptno and emp.ename=dept.dname;写错了吧,empno跟deptno不是对应关系,ename跟dname也不是对应关系,干吗让他们相等呢??
      

  3.   

    sorry ,是些错啦where emp.deptno=dept.deptno and emp.ename=myename;
      

  4.   

    desc emp ;查看下ename类型和myename varchar2(50),是否匹配
      

  5.   


    create or replace procedure li
    (
    myename varchar2,
    myloc out dept.loc%type ,
    mydname out scott.dept.dname%type
    )
    as
    begin
      select loc,dname into myloc,mydname
      from scott.emp,scott.dept
      where emp.empno=dept.deptno and emp.ename=dept.dname;
    end;
    --存储过程里面调用的参数不能设置其长度,也可以如你说的改成这样scott.emp.ename%TYPE,只是取其字段参数类型。
      

  6.   

    create or replace procedure li
    (
    myename varchar2,
    myloc out dept.loc%type ,
    mydname out scott.dept.dname%type
    )
    as
    begin
      select loc,dname into myloc,mydname
      from scott.emp,scott.dept
      where emp.empno=dept.deptno and emp.ename=dept.dname;
    end;