`

plsql存储过程、函数

阅读更多

629

-----------------------------plsql概述-------------------------------

过程语言
PLSQL的优势是:SQL语言可以直接写到PLSQL的“块”中或者是PLSQL的过程、函数中。
存储过程、函数、数据库触发器,Package包
PLSQL的另一个显著好处在于它可以通过减少来回交互减轻网络流量压力、节省时间
-------------------------------------------------------------------

------------------------------plsql的块-------------------------------
plsql每一段程序都是由block组成
块结构关键字(DECLARE, BEGIN,EXCEPTION 后面不跟分号;END后面需带分号;)
plsql的块包括三种:匿名块、存储过程、函数
------------------------------------------------------------------------


-------------------------------plsql变量------------------------------
PLSQL的变量类型:
1、系统内置的常规简单变量类型: 比如大多数数据库表的字段类型都可以作为变量类型;
2、用户自定义复杂变量类型: 比如记录类型;
3、引用类型:保存了一个指针值;
4、大对象类型( LOB):保存了一个指向大对象的地址;

plsql的变量声明
1、变量命名建议遵循通用规则,比如v_name 表示一个变量,c_name表示一个常量;
2、一般建议每一行声明一个变量,这样程序的可读性比较好;
3、如果声明了变量,但未进行初始化,则在没有赋值之前该变量的值为NULL; 一个好的编程习惯是对所有声明的变量进行初始化赋值。
4、在同一个块中,避免命名与数据库表中的字段名相同的变量;

PLSQL特有的%TYPE属性来声明与XX类型一致的变量类型

DBMS_OUTPUT.PUT_LINE()

PLSQL中的注释语句:
1、多行注释类似于java 或者C , 使用/* 和*/
2、单行注释是在语句后面使用–

块嵌套和变量范围:
1、PLSQL的块是可以嵌套的,变量的作用范围与其他语言类似
2、使用限定词:《outer》、《inner》
-----------------------------------------------------------------------------

-----------------------------------plsql控制语句------------------------------
1、基本循环
LOOP
statement1;
. . .
EXIT [WHEN condition];
END LOOP;

2、for循环
FOR counter IN [REVERSE]
lower_bound..upper_bound LOOP
statement1;
statement2;
. . .
END LOOP;

3、while循环
WHILE condition LOOP
statement1;
statement2;
. . .
END LOOP;
-----------------------------------------------------------------------------

----------------------------plsql复杂自定义数据类型--------------------------
PLSQL中常用的自定义类型就两种: 记录类型、PLSQL内存表类型
1、记录类型
TYPE type_name IS RECORD
      (field_declaration[, field_declaration]…);

identifier type_name;


2、%ROWTYPE属性:在PLSQL中%ROWTYPE 表示某张表的记录类型或者是用户指定以的记录类型


3、内存表
     1、使用BINARY_INTEGER 类型构成的索引主键;
     2、另外一个简单类型或者用户自定义类型的字段作为具体的数组元素。
      这种类型可以自动增长,所以也类似于可变长数组。
TYPE type_name IS TABLE OF
         {column_type | variable%TYPE
          | table.column%TYPE} [NOT NULL]
          | table.%ROWTYPE
          [INDEX BY BINARY_INTEGER];
--BINARY_INTEGER这种数据类型的值在-2147483647 ... 2147483647范围内
identifier type_name;
----------------------------------------------------------------------------

---------------------------------plsql游标-----------------------------------
1、隐式游标的几个属性
SQL%ROWCOUNT 受最近的SQL语句影响的行数
SQL%FOUND 最近的SQL语句是否影响了一行以上的数据
SQL%NOTFOUND 最近的SQL语句是否未影响任何数据
SQL%ISOPEN 对于隐式游标而言永远为FALSE

2、显式游标:对于返回多行结果的SQL语句的返回结果,可使用显式游标独立的处理器中每一行的数据。
     1、一行一行的处理返回的数据。
     2、保持当前处理行的一个跟踪,像一个指针一样指示当前的处理的记录。
     3、允许程序员在PLSQL块中人为的控制游标的开启、关闭、上下移动;
  过程
  声明游标:declare
  打开游标:open
  提取当前行到变量:fetch
  关闭游标:close
DECLARE
        v_empno employees.employee_id%TYPE;
        v_ename employees.last_name%TYPE;
        CURSOR emp_cursor IS
           SELECT employee_id, last_name
        FROM employees;
BEGIN
     OPEN emp_cursor;
  LOOP
    FETCH emp_cursor INTO v_empno, v_ename;
     EXIT WHEN emp_cursor%ROWCOUNT > 10 OR
                        emp_cursor%NOTFOUND;
     DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_empno)
                           ||' '|| v_ename);
      END LOOP;
     CLOSE emp_cursor;
END ;

--for循环

FOR record_name IN cursor_name LOOP
        statement1;
        statement2;
        . . .
END LOOP;

--游标带参数

CURSOR cursor_name
[(parameter_name datatype, ...)]
IS
select_statement;

--FOR UPDATE NOWAIT语句
使用for update nowait语句,倘若锁定失败我们就停止不再继续,以免
出现长时间等待资源的死锁情况。
SELECT ...
FROM ...
FOR UPDATE [OF column_reference][NOWAIT];

--WHERE CURRENT OF cursor
在循环体内做Update 或者Delete时需要有Where指向游标的当前记录
-------------------------------------------------------------------------------

-----------------------------plsql例外处理--------------------------------------
--PLSQL中的例外一般有两种:
1、Oracle 内部错误抛出的例外:这又分为预定义例外(有错误号+常量定义) 和非预定义例外
(仅有错误号,无常量定义)
2、程序员显式的抛出的例外

EXCEPTION
  WHEN exception1 [OR exception2 . . .] THEN
    statement1;
    statement2;
    . . .
  [WHEN OTHERS THEN
   statement1;
   statement2;
   . . .]

--处理预定义的例外

–NO_DATA_FOUND
–TOO_MANY_ROWS
–INVALID_CURSOR
–ZERO_DIVIDE
–DUP_VAL_ON_INDEX

--others的处理
Oracle 提供了两个内置函数SQLCODE 和SQLERRM 分别用来返回Oracle 错误号和错误描述

--处理非预定义的oracle错误
使用PRAGMA EXCEPTION_INIT 把错误号和例外名称联系起来
e_emps_remaining EXCEPTION;
PRAGMA EXCEPTION_INIT(e_emps_remaining, -2292);

--处理用户自定义的错误
DECLARE
e_invalid_department EXCEPTION;
BEGIN
UPDATE departments
SET department_name = &p_department_desc
WHERE department_id = &p_department_number;
IF SQL%NOTFOUND THEN
RAISE e_invalid_department;
END IF;
COMMIT;
EXCEPTION
WHEN e_invalid_department THEN
DBMS_OUTPUT.PUT_LINE('No such department id.');
END;

--RAISE_APPLICATION_ERROR() 函数
对于用户自定义的业务错误,如果觉得先定义再使用很麻烦,那么
也可以简单的使用raise_application_error() 来简化处理

--例外传递
当前块中不处理,传递到外层
-----------------------------------------------------------------------------------------


-------------------------------plsql的存储过程---------------------------------------
1、语法
CREATE [OR REPLACE] PROCEDURE procedure_name
       [(parameter1 [mode1] datatype1,
        parameter2 [mode2] datatype2,
        . . .)]
IS|AS
PL/SQL Block;

2、存储过程的参数模式
   -in 默认
   -out
   -in out

3、参数传递方式
按顺序传递或者使用=>符号传递
add_dept;
add_dept ('TRAINING', 2500);
add_dept ( p_loc => 2400, p_name =>'EDUCATION');

4、删除存储过程
DROP PROCEDURE procedure_name
--------------------------------------------------------------------------------------

------------------------------------plsql函数-----------------------------------------
1、语法
CREATE [OR REPLACE] FUNCTION function_name
        [(parameter1 [mode1] datatype1,
        parameter2 [mode2] datatype2,
        . . .)]
RETURN datatype
IS|AS
PL/SQL Block;

2、哪些sql语句中可以使用用户自定义函数
   -Select 语句
? -Where条件和Having子句
? -CONNECT BY, START WITH, ORDER BY, 和GROUP BY 子句
? -INSERT的Values子句
? -UPDATE的Set子句

▲3、用户自定义函数的限制
   -必须是个函数(不能是过程-Procedure)
? -只能用IN 模式的参数(不能有OUT, IN OUT 模式的参数)
? -只能接收SQL数据类型的参数,不能接收PLSQL 中特有的参数(比如记录、PLSQL内
    存表)
? -函数返回的数据类型也必须是有效的数据类型,而不能是PLSQL特有的数据类型
? -在SQL中使用的函数,其函数体内部不能有DML语句。
? -在UPDATE/DELETE语句中调用的函数,其函数体内部不能有针对同一张表的查询语句
? -在SQL中调用的函数,其函数体内部不能有事务结束语句(比如Commit,Rollback)

4、删除存储函数
DROP FUNCTION function_name

5、函数过程对数据访问的权限
-定义者权限:函数执行时,对表的访问默认使用定义者权限。
-调用者权限:AUTHID CURRENT_USER


分享到:
评论

相关推荐

    PLSQL 函数查询-- 初学者

    实践中,可以通过创建视图、存储过程、触发器等方式将这些函数结合起来,实现复杂的数据处理任务。同时,不断练习编写SQL语句,理解其运行机制,将有助于提升对PLSQL的掌握程度。记住,实践是检验理论的最好方法,多...

    oracle 数据库 plsql 存储过程

    ### Oracle数据库PL/SQL存储过程详解 #### 一、存储过程概述 **Oracle存储过程**是一种可以在Oracle数据库中存储并可被多次调用的PL/SQL代码块。它由一系列的PL/SQL语句组成,可以包含控制流程、变量声明等,能够...

    plsql存储过程源代码

    4. `6-scope.sql`: PL/SQL中的作用域是指变量、常量、过程和函数的有效范围。此文件可能讨论了如何在不同的作用域层次中定义和使用变量,以及局部变量和全局变量的区别。 5. `7-if.sql`: IF语句是条件控制结构,...

    PLSQL程序设计-存储过程函数触发器

    ### PL/SQL程序设计——存储过程、函数与触发器 #### 概述 PL/SQL是一种专门为Oracle数据库设计的过程化语言,它结合了SQL的数据操纵功能和传统编程语言的流程控制功能,使得开发者能够在数据库环境中编写更为复杂...

    练习利用PLSQL Developer编写和管理存储过程、存储函数和触发器等

    PLSQL Developer中存储过程、存储函数和触发器的编写和管理 PLSQL Developer是一种功能强大的Oracle数据库开发工具,提供了许多功能来帮助开发者快速编写和管理存储过程、存储函数和触发器等高级数据库对象。本文将...

    PLSQL调试存储过程

    通过以上方法,我们可以系统地调试PLSQL存储过程,找出隐藏的问题,提升代码质量和效率。调试是软件开发过程中的重要环节,对于理解复杂的数据库逻辑尤其关键。熟练掌握PLSQL调试技巧,能帮助我们快速定位和解决问题...

    PLSQL入门存储过程(详细注释案例).pdf

    根据提供的文件信息,我们可以深入探讨以下...以上就是基于给定文件信息对 PL/SQL 存储过程的基本介绍,包括语言特点、程序结构、数据类型与定义以及简单的示例代码。希望这些内容能够帮助初学者快速入门 PL/SQL 编程。

    plsql教程大全(语法入门、操作plsql、存储过程、函数、触发器、游标、包、返回类型)

    语法入门、操作plsql、存储过程、函数、触发器、游标、包、返回类型;一个execle表轻松搞定。

    plsql的存储过程

    2. **PACKAGE**:一组相关的存储过程和函数,可以共享数据和实现模块化。 3. **TRIGGER**:在特定数据库事件触发时自动执行的代码块。 在PL/SQL中,还可以使用匿名块,这是一种不存储在数据库中的代码块,通常用于...

    1-PLSQL过程函数包

    ### PL/SQL 过程与函数包详解 #### 一、引言 在数据库领域,尤其是Oracle数据库中,PL/SQL(Procedural Language for SQL)是一种强大的编程语言,它结合了SQL的数据处理功能和传统过程化编程语言的控制结构。通过...

    Oracle PLSQL存储过程循环LOOP跳处循环、退出循环、终止循环流程详解与实战指南

    2、函数示例:提供具体的函数代码和详细注释,让您不仅能理解每种控制策略的原理,还能直接应用到实际项目中。 3、注释详尽:每个函数代码实例都附带了详细的注释,解释了代码的作用和原理,大大降低了学习难度。 4...

    Oracle_PLSQL_存储过程

    **存储过程与函数的区别:** - **存储过程:** 没有返回值,主要用于执行一系列操作。 - **函数:** 有返回值,可以在查询语句中直接使用。 #### Oracle存储过程的基本语法 存储过程的基本语法如下: ```sql ...

    PLSQL存储过程教程

    《PLSQL存储过程教程》深度解析与应用指南 一、PL/SQL简介及重要性 PL/SQL(Procedure Language for SQL)是一种专为Oracle数据库设计的过程化语言,它结合了SQL的强大数据处理能力和传统编程语言的流程控制能力,...

    PLSQL函数存储过程

    系统里的案例 demp emp 表 使用%ROWTYPE直接定义记录变量

    ORACLE-PLSQL及存储过程自学资料

    在本自学资料中,我们将深入探讨PL/SQL的基本概念、结构、流程控制、运算符与表达式、游标、异常处理、存储过程和函数、包以及触发器。 首先,PL/SQL的全称是Procedure Language & Structured Query Language,它是...

    Oracle & PLSQL 储存过程基础

    ### Oracle & PLSQL 储存过程基础 #### 一、PL/SQL 语言基础 **1.1 什么是 PL/SQL** PL/SQL (Procedural Language for SQL) 是 Oracle 对标准 SQL 的一种扩展,它将过程化编程能力融入到 SQL 语言中,使得开发者...

    plsql 存储过程入门

    它主要用于在数据库环境中编写存储过程、函数、触发器和包等数据库对象,实现复杂的业务逻辑和数据处理。本文将从基础概念、数据类型、控制结构、循环、记录类型与集合类型、游标、异常处理以及存储过程和函数等方面...

    sql plsql 函数学习 Oracle 快速入门

    PL/SQL 是 Oracle 的过程化编程语言,它扩展了 SQL 的功能,允许编写存储过程、函数、触发器等。例如,你可以定义一个函数来处理特定的业务逻辑,然后在 SQL 查询中调用它。这增强了代码的复用性和数据库的性能。 ...

Global site tag (gtag.js) - Google Analytics