drop table student;
create table student
(
stuNo int primary key,
Name varchar2(10),
address varchar2(30),
birthday date
);
insert into student values(1,'梅超风','山东',to_date('1860-02-12 12:12:23','YYYY-MM-DD HH24:MI:SS'));
insert into student values(2,'陆成风','山西',to_date('1860-2-12','YYYY-MM-DD'));
insert into student values(3,'冯默风','安徽','10-2月-1886');
insert into student values(4,'曲灵风','湖南常德',to_date('1870-02-12 12:12:23','YYYY-MM-DD HH24:MI:SS'));
set serveroutput on
Rem ===================================================================
Rem 1、 创建简单的存储过程,如何执行存储过程
Rem ===================================================================
CREATE OR REPLACE PROCEDURE my_proc6
AS
BEGIN
DBMS_OUTPUT.PUT_LINE('这是一个简单的存储过程的例子!');
end my_proc6;
/
--下面是在PL/SQL中执行存储过程
begin
my_proc;
end;
/
--下面是在SQLPLUS中执行存储过程
execute my_proc;
Rem ===================================================================
Rem 2、 创建带参数的存储过程
Rem ===================================================================
CREATE OR REPLACE PROCEDURE sel_StuNameByNO_proc
(p_sNo student.stuNo%TYPE := 1)
AS
sName student.name%TYPE;
BEGIN
SELECT name into sName FROM student WHERE stuNo = p_sNo;
DBMS_OUTPUT.PUT_LINE('学号为:'||p_sNo||' 的姓名为:'||sName);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('学号为:'||p_sNo||' 的学员不存在');
END sel_StuNameByNO_proc;
/
--下面是在SQLPLUS中执行存储过程
execute sel_StuNameByNO_proc(p_sNo => 3); -- “=>”为指定参数赋值
execute sel_StuNameByNO_proc(2);
-- 带输出参数的存储过程
CREATE OR REPLACE PROCEDURE sel_StuName_proc
(p_sNo IN NUMBER,p_sname OUT VARCHAR2)
AS
BEGIN
SELECT name into p_sname FROM student WHERE stuNo = p_sNo;
EXCEPTION
WHEN NO_DATA_FOUND THEN
p_sname := NULL;
END sel_StuName_proc;
/
--下面是在SQLPLUS中执行存储过程
DECLARE
sName VARCHAR2(10);
sNo PLS_INTEGER;
BEGIN
DBMS_OUTPUT.PUT_LINE('请输入学号');
sNo := &sNo;
sel_StuName_proc(sNo,sName);
IF sName IS NULL THEN
DBMS_OUTPUT.PUT_LINE('学号为:'||sNo||' 的学员不存在');
ELSE
DBMS_OUTPUT.PUT_LINE('学号为:'||sNo||' 的姓名为:'||sName);
END IF;
END;
-- IN OUT 参数的过程
CREATE OR REPLACE PROCEDURE
swap(p1 IN OUT NUMBER, p2 IN OUT NUMBER)
IS
v_temp NUMBER;
BEGIN
v_temp := p1;
p1 := p2;
p2 := v_temp;
END;
/
DECLARE
num1 NUMBER := 100;
num2 NUMBER := 200;
BEGIN
swap(num1, num2);
DBMS_OUTPUT.PUT_LINE('num1 = ' || num1);
DBMS_OUTPUT.PUT_LINE('num2 = ' || num2);
END;
Rem ===================================================================
Rem 3、对存储过程授权
Rem ===================================================================
GRANT EXECUTE ON sel_StuNameByNO_proc TO SCOTT;
GRANT EXECUTE ON my_proc TO PUBLIC;
--在SCOTT模式下调用过程
EXECUTE ACCP.my_proc;
DROP PROCEDURE my_proc;
Rem ===================================================================
Rem 4、函数
Rem ===================================================================
REM 函数只能带有IN参数,不能带有IN OUT 或 OUT参数
REM 形式参数必须只使用数据库类型,不得使用PL、SQL类型
REM 函数的返回类型也必须是数据库类型
-- 一个简单的函数
CREATE OR REPLACE FUNCTION fun_hello
RETURN VARCHAR2
IS
BEGIN
RETURN '看,函数就这么简单吧.......';
END;
/
-- 执行函数
SELECT fun_hello FROM DUAL;
CREATE OR REPLACE FUNCTION verrify_stuNo
(sNo PLS_INTEGER) RETURN VARCHAR2
IS
max_no PLS_INTEGER;
min_no PLS_INTEGER;
BEGIN
SELECT MAX(stuNO),MIN(stuNO) INTO max_no,min_no
FROM student;
IF sNo >= min_no AND sNo <= max_no THEN
RETURN '您输入的学号有效.......';
ELSE
RETURN '学号超出范围......';
END IF;
END;
/
-- 在PL/SQL中执行函数
declare
msg varchar2(100);
begin
msg := verrify_stuNo(12);
dbms_output.put_line(msg);
end;
/
Rem ===================================================================
Rem 5、自主事务处理
Rem ===================================================================
PRAGMA AUTONOMOUS_TRANSACTION; --开启自主事务
CREATE OR REPLACE PROCEDURE p1
AS
sAddress VARCHAR2(20);
BEGIN
SELECT address INTO sAddress FROM student WHERE stuNo=2;
DBMS_OUTPUT.PUT_LINE('address:'||sAddress);
ROLLBACK; --回滚事务
END;
/
CREATE OR REPLACE PROCEDURE p2
AS
sAddress VARCHAR2(20);
BEGIN
UPDATE student SET address='体育中心' WHERE stuNo=2;
p1(); --调用过程p1
SELECT address INTO sAddress FROM student WHERE stuNo=2;
DBMS_OUTPUT.PUT_LINE('address:'||sAddress);
END;
/
EXECUTE p2;
Rem ===================================================================
Rem 6、程序包
Rem ===================================================================
-- 创建程序包规范
CREATE OR REPLACE PACKAGE pack_stu
IS
PROCEDURE sel_StuNameByNO_proc(p_sNo student.stuNo%TYPE := 1);
FUNCTION verrify_stuNo (sNo PLS_INTEGER) RETURN VARCHAR2;
END pack_stu;
/
-- 创建程序包主体
CREATE OR REPLACE PACKAGE BODY pack_stu
AS
PROCEDURE sel_StuNameByNO_proc
(p_sNo student.stuNo%TYPE := 1)
AS
sName student.name%TYPE;
BEGIN
SELECT name into sName FROM student WHERE stuNo = p_sNo;
DBMS_OUTPUT.PUT_LINE('学号为:'||p_sNo||' 的姓名为:'||sName);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('学号为:'||p_sNo||' 的学员不存在');
END sel_StuNameByNO_proc;
FUNCTION verrify_stuNo
(sNo PLS_INTEGER) RETURN VARCHAR2
IS
max_no PLS_INTEGER;
min_no PLS_INTEGER;
BEGIN
SELECT MAX(stuNO),MIN(stuNO) INTO max_no,min_no
FROM student;
IF sNo > min_no AND sNo < max_no THEN
RETURN '您输入的学号有效.......';
ELSE
RETURN '学号超出范围......';
END IF;
END verrify_stuNo;
END pack_stu;
/
-- 执行程序包中的过程和函数
EXECUTE pack_stu.sel_StuNameByNO_proc(2); --执行过程
DECLARE --执行函数
sNo PLS_INTEGER;
msg VARCHAR2(100);
BEGIN
sNo := &sNo;
msg := pack_stu.verrify_stuNo(sNo);
DBMS_OUTPUT.PUT_LINE(msg);
END;
/
Rem ===================================================================
Rem 程序包中的游标
Rem ===================================================================
Rem 在程序包中定义游标规范,在程序包主体中定义游标主体,
Rem 在程序包的子程序中打开和使用游标
-- 创建程序包规范
CREATE OR REPLACE PACKAGE pack_stu_cur
AS
CURSOR stu_cur(sNo NUMBER)
RETURN student%ROWTYPE;
PROCEDURE stu_proc(sNo NUMBER);
END pack_stu_cur;
/
-- 创建程序包主体
CREATE OR REPLACE PACKAGE BODY pack_stu_cur
AS
CURSOR stu_cur(sNo NUMBER) RETURN student%ROWTYPE
IS SELECT * FROM student WHERE stuNo>sNo;
PROCEDURE stu_proc(sNo NUMBER)
IS
stu_rec student%ROWTYPE;
BEGIN
OPEN stu_cur(sNo); --打开游标
LOOP
FETCH stu_cur INTO stu_rec;
EXIT WHEN stu_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(stu_rec.stuNo||' '||stu_rec.name||' '||
stu_rec.address||' '||stu_rec.birthday);
END LOOP;
CLOSE stu_cur; --关闭游标
END;
END pack_stu_cur;
/
-- 调用程序包中过程
EXEC pack_stu_cur.stu_proc(2);
/
Rem ===================================================================
Rem 程序包中的REF游标
Rem ===================================================================
Rem 可以使用程序包中的REF游标从Oracle存储过程返回记录集,
Rem Oracle存储过程本来不能返回值,但是可以利用IN OUT模式的
Rem 游标变量参数返回结果集
CREATE OR REPLACE PACKAGE pack_stu_ref
AS
TYPE stu_cur_type IS REF CURSOR RETURN student%ROWTYPE;
PROCEDURE stu_ref_proc(stu_rec IN OUT stu_cur_type);
END pack_stu_ref;
/
CREATE OR REPLACE PACKAGE BODY pack_stu_ref
AS
PROCEDURE stu_ref_proc(stu_rec IN OUT stu_cur_type)
IS
BEGIN
OPEN stu_rec FOR SELECT * FROM student;
END stu_ref_proc;
END pack_stu_ref;
/
--程序包调用
VARIABLE l_stu REFCURSOR;
EXECUTE pack_stu_ref.stu_ref_proc(:l_stu);
PRINT l_stu;
Rem ===================================================================
Rem 程序包中使用RECORD类型
Rem ===================================================================
CREATE OR REPLACE PACKAGE pack_test_rec
as
TYPE l_stu_type IS RECORD( --自定义记录类型
sNo student.stuNo%type,
sName student.name%type,
sAddress student.address%type
);
CURSOR stu_cur RETURN l_stu_type;
PROCEDURE stu_cur_proc;
END pack_test_rec;
/
CREATE OR REPLACE PACKAGE BODY pack_test_rec
AS
CURSOR stu_cur RETURN l_stu_type
IS SELECT stuNo,name,address FROM student;
PROCEDURE stu_cur_proc IS
stu_rec l_stu_type;
BEGIN
OPEN stu_cur;
LOOP
FETCH stu_cur INTO stu_rec;
EXIT WHEN stu_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(stu_rec.sNo||' '||
stu_rec.sName||' '||stu_rec.sAddress);
END LOOP;
CLOSE stu_cur;
END;
END pack_test_rec;
/
EXEC pack_test_rec.stu_cur_proc;
COLUMN LINE FORMAT 999
COLUMN TEXT FORMAT A70
SELECT line,text FROM USER_SOURCE WHERE NAME=UPPER('P2');
分享到:
相关推荐
学习永无止境:oracle存储过程总结_函数_语法_大全_详解
包含了存储过程,函数,包和触发器使用的基本原理和语法
SQL SERVER高效学习语言包(基本语法,函数,存储过程,事务,高效示例)
语法入门、操作plsql、存储过程、函数、触发器、游标、包、返回类型;一个execle表轻松搞定。
SQL语句大全,包含大部分SQL语句,函数及存储过程的详细介绍
压缩包包含13个文档和chm文件 系统的介绍了oracle存储过程的入门,例子,测试,高级功能。值得下载。
个人在使用VLOOKUP过程中总结的使用语法,其中包含实例讲解。
1.3.1、存储过程的优点:1.3.2、存储过程 与 函数 的区别二、自定义函数 udf(user-defined function )2.1、自定义函数 udf2.2、示例2.2.1、 无参数的自定义函数2.2.2、有参数的自定义函数三、复合结构3.1、语法格式...
oracle、MySQL、SqlServer、postger 四种数据库基本语法详细对比及用法,包含语言元素,数据类型,内置函数,四个数据库增删改查,游标,存储过程的对比及创建过程
SQLserver存储过程语法及实例,存储过程如同一门程序设计语言, 同样包含了数据类型、流程控制、输入和输出和它自己的函数库。
《Python编程基础与应用》电子教案 Python编程基础与应用-教案0605-使用lambda... lambda函数的语法只包含一个语句,lambda函数的语法格式如下: <函数名>=lambda <参数列表>:<表达式> 创建好匿名函数后,可以使用匿名
在学习的过程当中,可以参考C语言。 本节介绍WMLScript 中的两个重要概念:变量和数据类型。 预编译头 操作符与表达式 预编译就是在编译阶段控制编译器的行为。预编译头一般在文件开头和函数声明之前指定。...
也就是说,递归函数体的执行过程中可能会返回去再次调用该函数.在python里,递归函数不需要任何特殊的语法,但是它需要付出一定的努力去理解和创建. 我们会以一个简单的例子开始:写一个函数求一个自然数中...
存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。 一.创建存储过程 1.基本语法: create procedure sp_name() begin ......... end 2.参数传递 二.调用存储过程 1.基本...
标题 存储过程及函数 procedure 的建立和调用 function的建立和调用 标题 参数的调用(in 模式为按址调用,out / in out模式为按值调用。NOCOPY 强行转换成按址调用)。 标题 软件包及封装 软件包(PACKAGE...
Ø 常用查询 MySQL结束符是“;”结束。 1、 显示所有数据库 show databases; 2、 删除数据库 ...Ø select 查询、function 函数 select查询语句用得最广泛、功能也最丰富。可以完成单条记录、多条记录、单表...
创建sqlserver存储过程给第三方公司调用获取对应检查报告记录的需求,如果是oracle数据库的话,其实也可以参考oracle的语法将本文转换下,因为本文的原生脚本就是来自于oracle,读者略微研究下就明白,语法大同小异...
19_子类实例化过程.mp4 20_函数的复写.mp4 21_对象的转型.mp4 22_面向对象应用(一).mp4 23_抽象类和抽象函数(1).mp4 23_抽象类和抽象函数.mp4 25_包和访问权限(一).mp4 26_包和访问权限(二).mp4 27_包和访问权限...
利用单元(componet)、块(block)、过程(procure)和函数(function)等语句, 用结构化层次化的描述方法,使复杂电路的设计更加简便。采用包的概念,便于标准设计文 档资料的保存和广泛使用。
这些函数库提供了许多常用的算法和工具,可以大大简化算法开发的过程。 2. 易于学习和使用:Matlab具有简单易用的语法和直观的编程环境,使得算法开发者可以更快速地实现和测试他们的算法。Matlab的语法与数学表达式...