存储过程 函数

pl/sql中,匿名块我们要想下一次执行,则需要保存在磁盘介质上,这样每次用的时候,很麻烦。下面简单的介绍存储过程
存储过程:
不带参数的存储过程:
create or replace procedure WOO is
 v_sum  number  :=0;
begin
 for i in 1 .. 100
   loop
     v_sum := v_sum + i;
     end loop;
     DBMS_OUTPUT.PUT_LINE(v_sum);
  end WOO;
调用:
我们在pl/sql中测试:
begin
  -- Call the procedure
  woo;
end;
5050
在sqlplus中测试:
SQL> execute woo;     ==>(EXEC)
5050


PL/SQL 过程已成功完成。
或者:
SQL> begin
  2  woo;
  3  end;
  4  /
5050


PL/SQL 过程已成功完成。

带参数的存储过程:
用户hr里有张表t
我们向t里插进数据行:
create or replace procedure P_t(p_id in int, p_name in varchar2) is
begin
  insert into t values(p_id,p_name);
  COMMIT;
end P_t;
在pl/sql测试: 
begin
  -- Call the procedure
  p_t(p_id => :p_id,
      p_name => :p_name);
end;
下面输入窗口里的类型是float,string,oracle里没有这连个类型,我想应该是工具的问题.

我们根据id查找name:
create or replace procedure P_i(p_id in number, p_name out varchar2) is         ==>注意这里的类型后面不需要加精度,只需要写上变量的类型
begin
  select name into p_name from t where id=p_id;
end P_i;
在pl/sql里执行:

我们在sqlplus里执行: 
SQL> declare
  2   v_name   varchar2(10);       ==>注意这里我们需要定义一个变量用来接收传出的p_name
  3  begin
  4  P_I(1, v_name );
  5  DBMS_OUTPUT.PUT_LINE( v_name );
  6  end;
  7  /
wang
PL/SQL 过程已成功完成。
       
我们根据输入的ID来查找name:
create or replace procedure P_n(p_id_name in out varchar2)
is
begin
  select name into p_id_name from t where id =to_number( p_id_name); ==>注意这里我们强制转换,oracle也会自动转换,但是如果自己不强制转换,如果id上有索引,则就不走索引了
end P_n;
在pl/sql里测试:


通过上面的带参数举例,细心的读者已经发现已经说明了在pl/sql中很让初学者头疼的in , out ,  in  out参数:
in:在块中不可以改变,传进去的数不可以改变,如果上面的块中有p_id=3,则会报错
out: OUT表示从存储过程返回参数
in  out : IN OUT 表示传递参数和返回参数


函数:
上面已经介绍了存储过程,存储过程可以代替函数,只是函数有返回值。过程和函数很多相似,下面简述函数:
不带参数的函数:
create or replace function jisuan return number is
 v_sum  number :=0;
begin
  for i in 1..100
    loop
     v_sum := v_sum + i;
     end loop;
     DBMS_OUTPUT.PUT_LINE(v_sum);
     return v_sum ;
end  jisuan; ==>这里可以写上函数名称或者直接省略也行

带参数的函数:
create or replace function f_diy(r in number) return number is
  s number := 0;
  PI  constant number := 3.14159;
begin
  s :=PI*r*r;
  return s;
  DBMS_OUTPUT.PUT_LINE(s);
end f_diy;
在sqlplus里执行:
SQL> select f_diy(90) wang  from dual;


      WANG
----------
 25446.879
                       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值