`

数据库存储过程,包,函数语法

 
阅读更多

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  min_no AND sNo 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');




分享到:
评论

相关推荐

    GBase8s 数据库 SQL过程及函数应用

    GBase 8s 数据库 SQL 过程及函数应用 GBase 8s 数据库 SQL 过程及函数应用是指在 GBase 8s 数据库中使用 SQL 过程和函数来实现特定功能的一种方式。SQL 过程和函数是已经事先编译好的 SQL 语句集合,可以被用户的...

    数据库存储过程和函数.pdf

    3. 调试困难:不像常规的编程代码,数据库存储过程的调试相对复杂,MySQL并不支持调试存储过程的功能。 在MySQL中,存储过程和存储函数的类型包括: - 系统存储过程:以sp为前缀的存储过程,存储在master数据库中。...

    MySQL实验报告5(存储过程与函数)(1)(1).pdf

    根据提供的文件内容,本篇实验报告主要围绕MySQL数据库中存储过程和函数的应用,涵盖了创建存储过程、函数、游标以及异常处理等高级特性。下面将详细解析报告中的每个知识点。 1. 创建存储过程 存储过程是一种在...

    Oracle中的函数、存储过程、包

    Oracle数据库系统中,函数、存储过程和包是重要的PL/SQL编程元素,它们在数据库管理和应用开发中扮演着核心角色。 1. **函数**: - **系统函数**:Oracle预定义的一系列函数,如SYSDATE获取当前日期,USER获取当前...

    第11章MySQL存储过程与函数.docx

    MySQL 存储过程和函数是数据库中定义的一组用户定义的 SQL 语句集合。它们之间的区别在于: 1. 存储过程实现的功能要复杂一点,而函数实现的功能针对性比较强。 2. 存储过程可以返回参数,而函数只能返回值或者表...

    oracle存储过程_函数_语法_大全_详解

    ### Oracle存储过程、函数语法详解 #### 一、概述 Oracle数据库系统因其高效的数据处理能力,在企业级应用中被广泛采用。存储过程和函数作为Oracle数据库的重要组成部分,可以帮助开发人员编写更加灵活、高效的...

    MySQL数据库:存储函数调用.pptx

    查看数据库中的存储函数 语法格式为: SHOW FUNCTION STATUS 调用存储函数 语法格式为: SELECT sp_name ([func_parameter[,...]]) 存储函数创建完后,就如同系统提供的内置函数(如VERSION()),所以调用存储函数的...

    Oracle存储过程、函数和包

    - **定义**:存储过程和函数是特定类型的PL/SQL块,它们被存储在数据库中,作为命名的对象存在。 - **命名存储**:与普通的PL/SQL块不同,存储过程和函数具有名称,并且这些名称在数据库中是唯一的。 - **安全性**:...

    oracle函数大全及存储过程语法

    总结起来,Oracle函数和存储过程是数据库管理和开发中的重要工具,掌握它们的语法和应用对于优化数据库性能、提升开发效率以及保证数据安全具有重要意义。在实际工作中,应根据具体需求灵活运用,以实现更高效、更...

    oracle函数大全与存储过程语法-中文.rar

    本资源包“oracle函数大全与存储过程语法-中文.rar”涵盖了从Oracle 9i到10G版本的函数和存储过程的详细信息,旨在帮助用户深入理解和应用这些关键概念。 1. **Oracle函数大全**: - 函数是预定义的代码块,接受一...

    第8章 存储过程、函数和包.ppt

    Oracle 9i数据库系统提供了强大的编程能力,包括存储过程、函数和包的使用。这些特性极大地增强了数据库的灵活性和效率,使得复杂的业务逻辑可以直接在数据库层面上实现。 **存储过程和函数** 存储过程和函数是PL/...

    GBase 8S 自定义存储过程和函数.doc

    在GBase 8S中,创建存储过程的SPL(GBase 8S的编程语言)函数语法如下: ```sql CREATE [OR REPLACE] PROCEDURE/FUNCTION <存储过程名> ( <参数列表> ) BEGIN 语句块 END; ``` 如果存储过程需要返回值,可以使用`...

    存储过程和函数

    根据提供的文件信息,本文将详细解析数据库中的存储过程与函数,并深入探讨自主事务(autonomous_transaction)的概念及其在PL/SQL中的应用。 ### 一、存储过程 #### 1. 创建存储过程 存储过程是一种存储在数据库...

    Mysql存储过程和函数

    其中,存储过程和函数是MySQL提供的两种重要的编程特性,它们可以帮助开发者更加灵活地控制数据库操作流程。本文将详细介绍MySQL存储过程与函数的相关概念、创建方法以及使用技巧。 #### 二、存储过程与函数的区别 ...

    存储过程学习经典[语法+实例+调用]

    - **包**:用于组织和管理相关的存储过程、函数、类型等。 ##### 2. 创建存储过程的权限 - **CREATE PROCEDURE**:允许创建存储过程。 - **CREATE ANY PROCEDURE**:允许在任何模式下创建存储过程。 - **EXECUTE**...

    oracle存储过程和函数PPT

    在Oracle数据库开发中,存储过程和函数以及PL/SQL语言是至关重要的组成部分。这篇内容将深入解析这些核心概念。 首先,我们来谈谈“存储过程”。存储过程是一组预编译的SQL语句,可以在数据库中保存并重复调用,以...

    oracle高级语法(事物、函数、存储过程、触发器、异常)[参照].pdf

    Oracle 高级语法是指在 Oracle 数据库管理系统中使用的高级语法结构,包括事务、函数、存储过程、触发器、异常等。这些语法结构是 Oracle 数据库开发和管理的核心内容,对于数据库开发者和管理员来说是必备的知识。 ...

    access数据库创建存储过程

    在Access数据库中,存储过程是一种预编译的SQL语句集合,可以用来执行常见的数据库操作,如查询、插入、更新和删除数据。它们是数据库管理中的重要组成部分,提供了提高性能、增强安全性和简化复杂操作的功能。本文...

    MySQL数据库存储过程

    MySQL数据库存储过程是数据库管理系统中一个非常重要的特性,它允许开发者编写一组预编译的SQL语句,以函数或过程的形式存储在数据库中,供后续调用。这极大地提高了数据库应用的性能和效率,因为存储过程只需要在...

Global site tag (gtag.js) - Google Analytics