定义了一个存储过程;
create or replace procedure FindBaseInfo(
       v_id in out number,
       v_name out varchar2,
       v_title out varchar2
)is
temp integer(2);
begin  
    
       select count(*) into temp from employee where id=v_id;
       if temp>0 then
                select id,name,title into v_id,v_name,v_title from employee where id=v_id;
                
       else 
                v_id:=0;
                 dbms_output.put_line('nihao');
       end if;
end;
请问大牛们如何调用这个过程,给个简单的例子就可以能跑就行。我自己这么写的 但是报错 。真是怒了 一下午了。跪求。
DECLARE
 a   number;
 b   varchar2(10);
 c   varchar2(10);
 begin
 FindBaseInfo(&a,b,c);
end;我估计是变量a的问题,因为我如果输入a是数字的话 就报错。输入a是字符就可以打印语句。但是库里面id定义的也是number格式的。真服了。

解决方案 »

  1.   

    补充一下 我是在plsql里面运行的 数据库版本是oracle10g。
      

  2.   

    我重新试了一下 这么做是可以的。
    DECLARE
     a   number ;
     b   varchar2(10);
     c   varchar2(10);
     begin
     a:=&a;
     FindBaseInfo(a,b,c);
    end;但是如果直接调用 FindBaseInfo(1,b,c);这样是会报错的,难道plsel不允许直接给存储过程参数赋值吗,这明显是不对的,我就见过可以赋值的函数。
      

  3.   

    我估计是你那边传递参数的设置有问题。
    create or replace procedure FindBaseInfo(
      v_id in out number,
      v_name out varchar2,
      v_title out varchar2
    )IN,OUT,IN OUT是形参的模式。若省略,则为IN模式。IN模式的形参只能将实参传递给形参,进入函数内部,但只能读不能写,函数返回时实参的值不变。OUT模式的形参会忽略调用时的实参值(或说该形参的初始值总是NULL),但在函数内部可以被读或写,函数返回时形参的值会赋予给实参。IN OUT具有前两种模式的特性,即调用时,实参的值总是传递给形参,结束时,形参的值传递给实参。调用时,对于IN模式的实参可以是常量或变量,但对于OUT和IN OUT模式的实参必须是变量。
      

  4.   

    --存储过程示例如下
    create or replace procedure GetRecords(name_out out varchar2,age_in in varchar2) as     
    begin     
      select dummy into name_out from dual where dummy = age_in;     
    end;    
    Exec pro_selectAll(:results);
    --SQL*PLUS 执行如下
    var results varchar2;
    exec GetRecords(:results,'X');
    print results;
      

  5.   

    -- 跟你的参数无关!
    -- 主要是因为:
    -- oracle的select 语句在存储过程中需要用游标返回(不能像SQL Server一样直接用select语句获取数据)-- 例如:
    -- 实例:Oracle存储过程返回数据集CREATE table userinfo(id number(18,0), name varchar2(30), sex varchar2(10), age number(3,0), address varchar2(100));insert into userinfo(id,name,sex,age,address) values(1,'luoyoumou','男',33,'湖南省衡阳市');
    insert into userinfo(id,name,sex,age,address) values(2,'miaoxiaoming','男',32,'江西省吉安市');
    insert into userinfo(id,name,sex,age,address) values(3,'hanqiguang','男',28,'江西省赣州市');commit;-- create table userinfo2 as select * from userinfo where 1=2;-- i_address 是存储过程的输入参数,o_cur是存储过程的输出游标参数,用以获取返回的结果集!
    CREATE OR REPLACE PROCEDURE userinfo_proc(i_address VARCHAR2, o_cur OUT SYS_REFCURSOR)
    IS
      sqlstr VARCHAR2(200); -- 定义变量,用以存放SQL语句
    BEGIN
      sqlstr := 'SELECT Id, Name, Sex, Age, Address FROM userinfo WHERE Address = :i_address'; -- 给SQL变量赋值,其中 :i_address 是绑定变量,以提高执行效率!
      OPEN o_cur FOR sqlstr USING i_address; -- 给游标变量赋值
    END;
    /set serveroutput on;
    var c_cur refcursor;
    exec userinfo_proc('湖南省衡阳市',:c_cur);
    print c_cur;
      

  6.   

    定义了一个存储过程;
    create or replace procedure FindBaseInfo(
      v_id in out number,
      v_name out varchar2,
      v_title out varchar2
    )is
    temp integer(2);
    begin  
       
      select count(*) into temp from employee where id=v_id;
      if temp>0 then
      select id,name,title into v_id,v_name,v_title from employee where id=v_id;
       
      else 
      v_id:=0;
      dbms_output.put_line('nihao');
      end if;
    end;

    -- 如果你能确定 employee表中的id字段唯一的话,可以用变量返获取数据并返回!
    -- 如果employee表中的id字段不唯一的话,就需要借助游标返回数据!
      

  7.   

    create or replace procedure pro_query_emp
           (v_no in emp.ename%type,
           v_name out emp.ename%type,
           v_sal out emp.sal%type)
       is
           e_sal_error exception;
       begin
           select ename,sal into v_name,v_sal from emp where empno = v_no;
           if v_sal >= 2500 then
           dbms_output.put_line('该雇员工资'|| v_sal);
           dbms_output.put_line('该雇员工资'|| v_name);
           raise e_sal_error;
        end if;
      exception
        when no_data_found then
             dbms_output.put_line('没有该雇员:' || v_no);
        when e_sal_error then
             dbms_output.put_line('该雇员工资高于2500');
        end pro_query_emp;
     在plsql中的命令窗口中运行
    exec pro_query_emp;
    或者找到存储过程,点击测试,也是可以运行的。