Oracle存储过程Procedure基础语法

存储过程是个好东西,WEB工程在架构阶段会设计很多存储过程,后续在架构中开发需求的时候,反而会直接写SQL完成各项诉求。所以说,这玩意儿略微有那么一点点伪高端。

所属分类 数据库

相关标签 Oracle存储过程视图

关于存储过程

存储过程实际上是SQL+流程控制的结合体,相当于带了一丢丢编程的味道。

学会基础语法+流程控制语法,任何一个 Coder 都能够轻松地的写出存储过程了。

基础语法

--视图(VIEW)中只能用AS不能用IS,在游标(CURSOR)中只能用IS不能用AS。
--无参基础语法
CREATE OR REPLACE PROCEDURE p_Mebugs
AS
BEGIN    
    --删除180天前数据
    DELETE mebugs_log t WHERE (sysdate - to_date(t.starttime,'yyyyMMddhh24miss')) > 180; 
END p_Mebugs;
--传参基础语法,默认为入参
--可以通过IN OUT指定如(time OUT NUMBER,输出time)
--IN OUT可以同时指定,相当于两个参数,可以有多个参数(,号隔开)
--入参只能指定数据类型,不能指定长度
CREATE OR REPLACE PROCEDURE p_Mebugs(time NUMBER)  
AS
--定义参数
countNo NUMBER; 
--定义参数(可以指定长度)
testMsg VARCHAR2(256);  
--参数赋值(这里是个示例,没有使用到,可以用入参进行赋值)
testObj := 123; 
BEGIN
     --INTO 赋值(可以多个赋值 COL1,COL2 INTO 参数1,参数2)
    SELECT count(*) INTO countNo  FROM mebugs_log WHERE starttime=time;
    DBMS_OUTPUT.PUT_LINE(time||'记录数'||countNo);
--异常场景
EXCEPTION
--记录不存在
WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('没有找到记录');
END p_Mebugs;

调用存储过程

--调用存储过程
EXEC p_Mebugs(time);
--获取出存储过程,在程序块(BEGIN END块)中调用(存储过程就相当于JAVA中的一个方法)
DECLARE time NUMBER;
BEGIN
    p_Mebugs(time);
    DBMS_OUTPUT.PUT_LINE(pname);
END;

维护存储过程

--维护操作
--删除存储过程
DROP PROCEDURE p_Mebugs;
--查看过程状态
SELECT object_name,status FROM USER_OBJECTS WHERE object_type='PROCEDURE';
--重新编译过程
ALTER PROCEDURE p_Mebugs COMPILE;
--查看过程代码
SELECT * FROM USER_SOURCE WHERE TYPE='PROCEDURE';

流程控制

流程控制相关语法(在BEGIN...END程序块中运行)

--判断条件示例:TEST=1
--IF判断
IF 判断条件 THEN
    BEGIN
    --DOING SQL
    END;
ELSIF 判断条件 THEN
    BEGIN
    --DOING SQL
    END;
ELSE
    BEGIN
    --DOING SQL
    END;
END IF;
--WHILE循环
WHILE 判断条件 LOOP
BEGIN
    --DOING SQL
END;
END LOOP;
--FOR IN 循环
FOR 参数 IN 数组/游标 LOOP 
BEGIN
    --DOING SQL
END;
END LOOP;

关于数组/游标

Oracle 中本是没有数组的概念的。

数组其实就是一张表(Table), 每个数组元素就是表中的一个记录。

用户可以使用Oracle 已经定义好的数组类型,testPram OUT array。

Oracle中Cursor是非常有用的。

游标用于遍历临时表中的查询结果(简单理解就是游标型变量用于存多个值,可以被遍历)。

其相关方法和属性也很多,此处常规介绍。

--Cursor型游标(不能用于参数传递) 
CREATE OR REPLACE PROCEDURE p_Mebugs
--回顾上文说过游标IS 视图AS
IS  
--游标1 直接赋值
cusorTest1 Cursor ID SELETE starttime FROM mebugs_log; 
cusorTest2 CursorBEGIN    
    --游标2 代码块赋值
    SELETE starttime INTO cusorTest2 FROM mebugs_log; 
END p_Mebugs;
--SYS_REFCURSOR型游标,Oracle预先定义的游标,可作出参数进行传递 
CREATE OR REPLACE PROCEDURE p_Mebugs(testCursor OUT SYS_REFCURSOR)
--回顾上文说过游标IS 视图AS
IS  
cursor SYS_REFCURSOR;
name varhcar(20);  
BEGIN    
    --SYS_REFCURSOR只能通过OPEN方法来打开
    OPEN cursor FOR SELETE starttime FROM mebugs_log;
    LOOP 
                --SYS_REFCURSOR 只能通过fetch into 来打开和遍历;
        FETCH cursor INTO name; 
                --SYS_REFCURSOR 中可使用三个状态属性:%NOTFOUND(未找到记录信息) %FOUND(找到记录信息) %ROWCOUNT( 当前游标所指向的行位置)        
        EXIT WHEN cursor%NOTFOUND; 
        DBMS_OUTPUT.PUTLINE(name); 
    END LOOP;
--赋值给出参    
testCursor := cursor; 
END p_Mebugs;
--游标遍历(FETCH打开)可以同时赋给多个变量
DECLARE   
    name VARCHAR2(10);  
    time VARCHAR2(10);  
    CURSOR emp_cursor IS SELECT name,time FROM mebugs_log;  
BEGIN  
    OPEN emp_cursor;  
    FETCH emp_cursor INTO v_ename,v_job; 
--略...

米虫

做一个有理想的米虫,伪全栈程序猿,乐观主义者,坚信一切都是最好的安排!

本站由个人原创、收集或整理,如涉及侵权请联系删除

本站内容支持转发,希望贵方携带转载信息和原文链接

本站具有时效性,不提供有效、可用和准确等相关保证

本站不提供免费技术支持,暂不推荐您使用案例商业化

发表观点

提示

昵称

邮箱

QQ

网址

当前还没有观点发布,欢迎您留下足迹!

同类其他

数据库

SPOOL导出指定格式的Oracle数据文件

为了方便数据的处理,或者本身有特殊的数据格式要求,我们可以使用SPOOL命令导出Oracle数据库数据数据文件,并指定格式,高效且强大...

Orcale定时任务管理dbms_job

在Oracle中创建、运行、维护定时任务,配合存储过程可以完成很多特定的业务诉求,dbms_job提供了使用的API功能便于我们实现更为细致的定时任务管理

Oracle数据库基础实用维护命令集

Linux系统下的Oracle数据库实用常用的维护命令整理,本文内容偏向运维,主要包含:基础启动重启、表空间维护、数据库角色与用户维护、字符集配置等,并给出各类场景的实例语句

MongoDB通过$lookup实现多表连接查询

对于数据库而言,多表连接操作可以算的上是基本操作,在 MongoDB 通过 $lookup 聚合查询可以实现多表左连接查询,在后续的版本中 $lookup 得到了一系列的增强,实现更为复杂的关联查询

MySql数据库设置表名大小写不敏感

MySql数据库在Linux系统下默认数据库名与表名严格区分大小写,一般情况下我们创建表名习惯使用全小写,如果遇到某些从Windows服务器迁移过来的数据库可能需要设置大小写不敏感

MySql安装错误提示找不到MSVCP120.dll

安装 MySql 出现“由于找不到 MSVCP120.dll ,无法继续执行代码。重新安装程序可能会解决此问题。”由于系统缺少 vcredist 导致,下载安装官方 vcredist 即可。

选择个人头像

昵称

邮箱

QQ

网址

评论提示

  • 头像:系统为您提供了12个头像自由选择,初次打开随机为你选择一个
  • 邮箱:可选提交邮箱,该信息不会外泄,或将上线管理员回复邮件通知
  • 网址:可选提交网址,评论区该地址将以外链的形式展示在您的昵称上
  • 记忆:浏览器将记忆您已选择或填写过得信息,下次评论无需重复输入
  • 审核:提供一个和谐友善的评论环境,本站所有评论需要经过人工审核