320 likes | 583 Views
第 18 课 PL/SQL. PL/SQL 的概念 BLOCK FUNCTION PROCEDURE. 教学目标. PL/SQL 是 Oracle 对 SQL 规范的扩展,是一种块结构语言 . 构成一个 PL/SQL 程序的基本单位(过程、函数和无名块)是逻辑块 . 可包含任何数目的嵌套子块。 PL/SQL 与一般结构化语言一样,有变量和常量 ,控制语句 ,循环语句等。 PL/SQL 与 sql 一样,不区分大小写。 看 :fun_proc.txt 中的各程序段。. PL/SQL 的概念. DECLARE --- 说明 BEGIN --- 语句序列
E N D
PL/SQL的概念 BLOCK FUNCTION PROCEDURE 教学目标
PL/SQL是Oracle对SQL规范的扩展,是一种块结构语言 . 构成一个PL/SQL程序的基本单位(过程、函数和无名块)是逻辑块.可包含任何数目的嵌套子块。 PL/SQL与一般结构化语言一样,有变量和常量 ,控制语句 ,循环语句等。 PL/SQL与sql一样,不区分大小写。 看:fun_proc.txt中的各程序段。 PL/SQL的概念
DECLARE ---说明 BEGIN ---语句序列 EXCEPTION ---例外处理程序 END; Block Structure
Block Structure • DECLARE (optional) Define PL/SQL objects to be used within this block • BEGIN (强制) Executable statements • EXCEPTION (optional) What to do if the executable action causes an error condition • END; (强制)
Development Environments • SQL*Plus 使用PL/SQL engine in the Oracle Server • Procedure Builder 使用the PL/SQL engine in the client tool or in the Oracle Server
第一个例子:fun_proc.txt DECLARE num_a NUMBER := 6; num_b NUMBER; BEGIN num_b := 0; num_a := num_a / num_b; num_b := 7; dbms_output.put_line(' Value of num_b ' || num_b); EXCEPTION WHEN ZERO_DIVIDE THEN dbms_output.put_line('Trying to divide by zero'); dbms_output.put_line(' Value of num_a ' || num_a); dbms_output.put_line(' Value of num_b ' || num_b); END;
注: dbms_output.put_line(…)是一个oracle内置包中的函数,可以在sqlplus中输出()内的值。 PL/SQL使用两种注释: 单行注释: --注释文字 多行注释:/*…….. …………………………*/ EXCAMPLE:fun_proc.txt中的匿名block whith comment PL/SQL的注释
支持SQL:几乎所有SQL可以在PL/SQL使用; 生产率高; 性能好; 可移植性 :在不同平台代码相同; 与ORACLE集成. PL/SQL的优点
可重用性:PL/SQL blocks can be named and stored in the Oracle server and reused as required in another PL/SQL program or from the SQL com-mand line. The small unit of code is more manageable and reusable. 安全性高:Security on PL/SQL structures stored in the server can be managed using the Oracle database objects syntax. You can grant and revoke privileges on these stored PL/SQL programs to and from other users in the database. PL/SQL的优点
减少网络压力: With SQL, Oracle must process each SQL statement one at a time. In a networked environment, this means that a separate call must be made to the Oracle server each time a SQL statement is issued, With PL/SQL, the entire block of statements is sent to the Oracle server at one time, reducing network traffic. PL/SQL的优点
PL/SQL运行系统是一种技术,不是一种独立产品,PL/SQL运行系统是一种技术,不是一种独立产品, 它是PL/SQL块和子程序的一种解释器,它可接收任何有效的PL/SQL块或子程序。最终,变为SQL. PL/SQL机可执行过程性语句,将对应SQL语句发送到ORACLE服务器上的SQL语句执行器。 见图:plsql_Engine.pdf PLSQL的运行原理
PL/SQL Program Constructs Stored procedure/function 匿名block DECLARE BEGIN Applicationprocedure/function Applicationtrigger EXCEPTION END; Databasetrigger Package Object type
A PL/SQL block can be a named block or an anonymous(匿名) block. 前面的例子就是一个匿名 block.匿名blocks can be used in the server side(在ORACLE SERVER中) or client side(DEVELOPER2000系列). There are two types of named blocks:Function,Procedure PL/SQL
函数: Function Takes zero or more parameter values and returns one value 过程: Procedure Takes zero or more parameter values and may return value through parameters. PL/SQL
FUNCTION name [(parameter [,parameter,…])] RETURN datatype IS //或AS [local declarations ] BEGIN executable statements [EXCEPTION exception handlers ] END [name ]; PL/SQL
A function accepts zero or more input parameters and returns one value. Function通过其返回值,返回结果。 The datatype of the return value is defined when the function is created.注意:并不定义长度。 User-defined functions can be used in the same way as Oracle built-in single-row functions. EXCAMPLE:fun_proc.txt中的find_area PL/SQL
PROCEDURE name [(parameter [,parameter,…])] IS //或AS [local declarations ] BEGIN executable statements [EXCEPTION exception handlers ] END [name ]; PL/SQL
A procedure is a PL/SQL block that accepts zero or more parameters as input (IN), output (OUT), or both (INOUT). Unlike functions, procedures do not return a value; the INOUT parameter or OUT parameter may be used instead to pass a value from the procedure. PL/SQL
Procedures cannot be used in SQL statements; 在SQLPLUS中用EXECUTE,CALL 语句调用 EXCAMPLE:fun_proc.txt中的get_area, my_first_proc 在PL/SQL block内直接调用: PL/SQL
function 的参数可以使用out定义吗? create or replace function find_area (vlength in number,vwidth in number) return number…. create or replace function find_area (vlength in number,vwidth in number,varea out number ) return number….正确吗? EXAMPLE:fun_proc.txt PL/SQL
存储于数据库中 A function is created in the database using a CREATE OR REPLACE command. A procedure created in the database using a CREATE OR REPLACE command. 存储于数据库中的函数,过程是数据库对象。叫存储过程 EXAMPLE:fun_proc.txt PL/SQL
PL/SQL blocks may be compiled separately and stored in the database,this is called a 存储过程. Function,procedure都是存储过程。 存储过程经编译和优化后存储在数据库服务器中,使用时只要调用即可 在ORACLE中,若干个有联系的过程可以组合在一起构成程序包。 存储过程
练习: 建立一个求圆面积的函数 建立一个圆面积的过程,测试 存储过程
Developing Stored Procedures Oracle Procedure Builder Edit Textfile Systemeditor 1 Store in database Sourcecode 2 Compile p-code Execute
ORACLE 创建存储过程的语法为: create [or replace] procedure 过程名 ( 参数1 [in|out|in out] 数据类型 [,参数2 [in|out|in out] 数据类型]... ) {is|as} pl/sql 语句块 注意:没有declare,变量定义在is 之后 EXAMPLE: sm_procedure.txt 存储过程
ORACLE 创建存储函数的语法为: create [or replace] FUNCTION name [(parameter [,parameter,…])] RETURN datatype IS/AS pl/sql 语句块 EXAMPLE: sm_procedure.txt 存储过程
练习: 建立一个log_user表,存username,log_time, 建立一个存储过程,记录当前用户,及时间 存储过程
存储过程有以下的优点: 存储过程的能力大大增强了SQL语言的功能和灵活 性。存储过程可以用流控制语句编写,有很强的灵 活性,可以完成复杂的判断和较复杂的运算。 可保证数据的安全性和完整性。 存储过程
在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。 由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。 可以降低网络的通信量。 存储过程
PL/SQL的概念 BLOCK FUNCTION PROCEDURE 小结