定义了一个存储过程;
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格式的。真服了。
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格式的。真服了。
DECLARE
a number ;
b varchar2(10);
c varchar2(10);
begin
a:=&a;
FindBaseInfo(a,b,c);
end;但是如果直接调用 FindBaseInfo(1,b,c);这样是会报错的,难道plsel不允许直接给存储过程参数赋值吗,这明显是不对的,我就见过可以赋值的函数。
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模式的实参必须是变量。
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;
-- 主要是因为:
-- 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;
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字段不唯一的话,就需要借助游标返回数据!
(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;
或者找到存储过程,点击测试,也是可以运行的。