存储过程实际上是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 Cursor;
BEGIN
--游标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;
--略...
当前还没有观点发布,欢迎您留下足迹!
很多运维人员习惯采用默认安装的方式安装Oracle数据库,而Oracle日志默认放置在/opt目录下,绝大多数Linux环境的大磁盘往往挂载在/home,因此经常会出现磁盘空间不足的情况,采用本文配置可指定并迁移日志
Linux系统下的Oracle数据库实用常用的维护命令整理,本文内容偏向运维,主要包含:基础启动重启、表空间维护、数据库角色与用户维护、字符集配置等,并给出各类场景的实例语句
登录Oracle报错 ORA-00257: archiver error. Connect internal only, until freed. 由于归档日志(archive log)已满引起的。
Oracle 9i版本引入MERGE INTO语句,其主要用于实现条件入库能力,用于解决对于已有数据更新升级的情况,即可实现不存在数据则插入,存在数据则更新的分支判断形式的更新能力
对于数据库而言,多表连接操作可以算的上是基本操作,在 MongoDB 通过 $lookup 聚合查询可以实现多表左连接查询,在后续的版本中 $lookup 得到了一系列的增强,实现更为复杂的关联查询
当我们需要清理或删除某张表或数据的时候,通常会有采取DELETE、TRUNCATE、DROP的任意一种形式的SQL语句,他们之间作用的对象不同所产生的效果也各不相同,包括执行结果和效率