设为首页 收藏本站
查看: 659|回复: 0

[经验分享] oracle 存储过程 基础

[复制链接]

尚未签到

发表于 2016-7-20 08:13:39 | 显示全部楼层 |阅读模式
  差不多一年没写过存储过程,最近要写,发现基本忘了,google一番之后,觉得很有必要把基础的东西写下来备忘。
  


  • 语句块定义:

decalre
-- 变量声明
var1 number(2);                -- 仅声明
var2 char(2) := '11';          -- 在声明的同时初始化
begin
-- 语句
end; -- 语句块结束
  


  • if 语句

if a = 1 or b = 2 then
elsif c = 3 then
else
end if;
  
  


  • case 语句
  case语句如果作为分支控制语句,最后结束语句是end case,如果是作为select语句里的控制语句则只需要end。

declare
num number(10) := 1;
begin
case
when num = 0 then dbms_output.put_line( 'zero');
when num = 1 then dbms_output.put_line( 'one');
else  dbms_output.put_line( 'default');
end case;
case num
when 0 then dbms_output.put_line( 'zero');
when 1 then dbms_output.put_line( 'one');
else  dbms_output.put_line( 'default');
end case;
end;
 


  • for 循环
  for循环主要有两个用处。
  

1、 循环一个范围

格式:for i in [start .. end] loop ... end loop;

  for i in 0..9 loop
dbms_output.put_line('i:' || i);
end loop;
   

2、遍历隐式游标


隐式游标的好处是不需要手动关闭,方便

for currow in (
select t.col1, t.col2
from tableName t
where ...
) loop
if currow.col1 = 0 then
return;    -- 中止sp,返回
end if;
end loop;
  


  • while 循环

    isok := 9;
while isok >= 0 loop
isok := isok - 1;
if isok = 8 then
continue;                -- 与编程语言的 continue 语义一样,跳过当前循环的剩余语句,回到循环开始
end if;
if isok = 4 then
exit;                    -- 与编程语言的 break 语义一样,跳出循环
end if;
dbms_output.put_line('isok:' || isok);
end loop;
dbms_output.put_line('outside while loop .');
  


  • 存储过程定义

create or replace procedure sp_name (
-- 入参、出参列表, 逗号分隔。
uid in varchar2,                          -- 不能带长度信息
startDate in date,                        -- 第二个输入参数
defaultVar in varchar2 default "",        -- 默认参数,如果不传,要注意参数的顺序
isok out number,                          -- 输出参数
result out varchar2                       -- 第二个输出参数
)
as
-- 变量声明,每个声明用分号结束。可以在声明的同时初始化
var1 varchar2(11);
var2 number(2) := 123;
begin
-- 字符串拼接用 ||
dbms_output.put_line('isok:' || 'abc');
-- 调用其他存储过程
sub_sp_name(param1, prarm2, outParam1, outParam2);
end;        -- 存储过程结束
  


  • 函数定义

create or replace function func  (
-- 入参、出参列表, 逗号分隔。
uid in varchar2,                          -- 不能带长度信息
startDate in date,                        -- 第二个输入参数
defaultVar in varchar2 default "",        -- 默认参数,如果不传,要注意参数的顺序
isok out number,                          -- 输出参数
result out varchar2                       -- 第二个输出参数
)
return number      -- 定义返回类型
as
-- 变量声明,每个声明用分号结束。可以在声明的同时初始化
var1 varchar2(11);
var2 number(2) := 123;
begin
-- 字符串拼接用 ||
dbms_output.put_line('isok:' || 'abc');

return ret_val;
end;
 

  • 存储过程与函数异同
  1、两者定义类似,都可以带输入输出参数。

2、函数有返回值,存储过程没有。

3、函数的调用要在select语句里;而存储过程不用,可以独立调用。


  • 游标
  隐式游标


隐式游标的好处是不需要手动关闭,方便

for currow in (
select t.col1, t.col2
from tableName t
where ...
) loop
if currow.col1 = 0 then
return;    -- 中止sp,返回
end if;
end loop;
  
  显式游标


declare
isok integer;
v_event_id number(10);
v_isagain number(2);
v_rate number(2);
v_sender char(11) := '13800138000';
cursor cursorVar is select event_id, isagain, rate from call_event where sender = v_sender; -- 声明游标

begin
open cursorVar;    -- 打开游标
loop
fetch cursorVar into v_event_id, v_isagain, v_rate;       -- 取值
exit when cursorVar%notfound;                             --当没有记录时退出循环
dbms_output.put_line(v_event_id || ', ' || v_isagain || ', ' || v_rate);
end loop;
close cursorVar;   -- 关闭游标
--游标的属性有:%FOUND,%NOTFOUNRD,%ISOPEN,%ROWCOUNT;
--%FOUND:已检索到记录时,返回true
--%NOTFOUNRD:检索不到记录时,返回true
--%ISOPEN:游标已打开时返回true
--%ROWCOUNT:代表检索的记录数,从1开始
end;
   带参数游标


declare
isok integer;
v_event_id number(10);
v_isagain number(2);
v_rate number(2);
v_sender char(11) := '13800138000';
cursor cursorVar(p_sender varchar2) is select event_id, isagain, rate from call_event where sender = p_sender; -- 声明游标
begin
open cursorVar(v_sender);    -- 打开游标,在括号里传参。
loop
fetch cursorVar into v_event_id, v_isagain, v_rate;       -- 取值
exit when cursorVar%notfound;                             --当没有记录时退出循环
dbms_output.put_line(v_event_id || ', ' || v_isagain || ', ' || v_rate);
end loop;
close cursorVar;   -- 关闭游标
end;
   

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-246573-1-1.html 上篇帖子: 在oracle中,修改主键 下篇帖子: oracle 随机取数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表