Oracle数据库基础及应用第13章 存储过程与函数和触发器

合集下载

oracle存储过程学习经典语法实例调用

oracle存储过程学习经典语法实例调用

O r a c l e存储过程学习目录Oracle存储过程基础知识商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。

存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。

这样的结果就是,代码存储一次但是能够被多个程序使用。

要创建一个过程对象 procedural object ,必须有 CREATE PROCEDURE 系统权限。

如果这个过程对象需要被其他的用户schema 使用,那么你必须有 CREATE ANY PROCEDURE 权限。

执行procedure 的时候,可能需要excute权限。

或者EXCUTE ANY PROCEDURE 权限。

如果单独赋予权限,如下例所示:grant execute on MY_PROCEDURE to Jelly调用一个存储过程的例子:execute MY_PROCEDURE 'ONE PARAMETER' ;存储过程 PROCEDURE 和函数 FUNCTION 的区别。

function有返回值,并且可以直接在Query中引用function和或者使用function的返回值。

本质上没有区别,都是 PL/SQL 程序,都可以有返回值。

最根本的区别是:存储过程是命令, 而函数是表达式的一部分。

比如:select max NAME FROM但是不能 exec max NAME 如果此时max是函数。

PACKAGE是function,procedure,variables 和sql 语句的组合。

package允许多个procedure使用同一个变量和游标。

创建 procedure的语法:Sql 代码:可以使用 create or replace procedure 语句, 这个语句的用处在于,你之前赋予的excute 权限都将被保留。

IN, OUT, IN OUT用来修饰参数。

数据库oracle基础知识

数据库oracle基础知识

数据库oracle基础知识数据库Oracle是一款企业级关系数据库管理系统,被广泛应用于大型企业和政府机构。

为了从事Oracle数据库开发工作,需要掌握以下基础知识。

1. SQL语言SQL语言是Oracle数据库最常用的查询和管理语言。

它可以用于创建、修改和删除表格、存储过程和函数等对象。

SQL语言可以通过命令行工具或GUI工具(如Oracle SQL Developer)使用。

2. 数据类型Oracle数据库支持多种数据类型,包括字符型、数值型、日期型和布尔型等。

掌握各种数据类型的特点和使用方法对于正确存储数据非常重要。

3. 约束在Oracle数据库中,约束是定义表列或表之间关系的规则。

包括主键、外键、唯一约束和检查约束等。

理解和正确使用约束可以有效维护数据完整性。

4. 触发器触发器是一种在表上执行的操作,例如在插入、更新和删除时。

掌握触发器的创建和使用可以帮助开发者增强数据的一致性和完整性。

5. 存储过程和函数存储过程和函数是一些预定义的SQL语句,封装起来方便被调用。

存储过程和函数类似,但存储过程是没有返回值的,而函数则需要返回一个值。

掌握存储过程和函数的使用可以提高数据库的性能和效率。

6. 高可用性Oracle数据库提供了许多机制,确保在故障时保持数据库高可用性。

这包括了备份和恢复、灾备等方案。

掌握这些机制可以帮助开发者保障数据可靠性和业务连续性。

通过学习以上基础知识,可以使Oracle数据库开发者理解Oracle数据库的基本原理和概念。

并且可以使用这些知识来开发高效、高可用性、可扩展的Oracle数据库应用程序。

oracle 触发器工作原理

oracle 触发器工作原理

oracle触发器工作原理Oracle数据库中的触发器是一种存储过程,它在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行。

触发器可以用于实现数据一致性、审计、业务规则验证和复杂的数据处理逻辑。

以下是Oracle触发器工作原理的基本概述:1.定义与激活:在Oracle中,通过使用CREATE TRIGGER语句创建触发器,指定其名称、触发时机(BEFORE或AFTER)、触发事件(INSERT、UPDATE、DELETE或COMMIT等)以及作用的对象(表或视图)。

2.触发时机:BEFORE触发器会在实际操作之前执行,此时可以查看并修改将要插入、更新或删除的数据。

AFTER触发器则在实际操作完成之后执行,此时只能查看已经更改后的结果。

3.触发上下文:对于INSERT操作,触发器可以通过:NEW伪记录访问被插入的新行数据。

对于UPDATE操作,触发器同时可以获得:OLD和:NEW伪记录,分别代表更新前的老数据和更新后的新数据。

对于DELETE操作,触发器可以通过:OLD伪记录访问即将被删除的行数据。

4.执行逻辑:触发器内的PL/SQL代码会根据触发条件进行执行,可以包含任何合法的PL/SQL命令,包括对其他表的操作、控制流语句、异常处理等。

5.事务处理:触发器是事务的一部分,所以它们遵循ACID属性,并且其行为受当前事务的影响。

例如,如果事务回滚,则触发器所做的所有变更也会随之回滚。

6.实例应用:举例来说,一个AFTER INSERT触发器可能用来记录新插入数据到审计表中;而一个BEFORE UPDATE触发器可能用于检查更新的数据是否满足某些业务规则,如果不满足则阻止更新操作。

总之,Oracle触发器是数据库系统内嵌的一种自动化机制,它在特定数据库事件发生时自动执行预定义的逻辑,为确保数据完整性和业务规则得以强制执行提供了强大的支持。

oracle trigger 里引用procedure

oracle trigger 里引用procedure

在Oracle 中,触发器(Trigger)是一种特殊的数据库对象,用于自动执行特定的操作(如插入、更新或删除)之前或之后的数据更改。

触发器可以引用存储过程(Procedure)来执行一系列操作。

要在触发器中引用存储过程,您需要按照以下步骤进行操作:1. 创建存储过程:首先,创建一个存储过程,其中包含要在触发器中执行的逻辑和操作。

例如,您可以创建一个存储过程来更新某个表中的数据。

```sqlCREATE PROCEDURE update_data (p_id NUMBER,p_value VARCHAR2) ASBEGINUPDATE your_tableSET column_name = p_valueWHERE id = p_id;END;```2. 创建触发器:接下来,创建一个触发器,该触发器将在特定事件(如 INSERT、UPDATE 或 DELETE)发生时自动执行。

在触发器中,使用PL/SQL 代码块调用存储过程。

例如,以下是一个在 INSERT 事件后执行的触发器的示例:```sqlCREATE TRIGGER trigger_nameAFTER INSERT ON your_tableFOR EACH ROWBEGINupdate_data(:NEW.id, :NEW.column_name);END;```在上面的示例中,触发器`trigger_name` 在`your_table` 表上执行INSERT 操作后被触发。

触发器使用`:NEW` 关键字引用新插入的行中的列值,并调用`update_data` 存储过程来更新数据。

3. 测试触发器和存储过程:完成触发器和存储过程的创建后,您可以使用适当的方式(如插入新记录或更新现有记录)来测试触发器和存储过程的执行。

确保触发器正确地调用存储过程并执行所需的操作。

请注意,上述示例仅演示了如何在触发器中调用存储过程的基本概念。

根据您的具体需求和数据库结构,您可能需要进行适当的调整和修改。

Oracle触发器trigger详解

Oracle触发器trigger详解

Oracle触发器trigger详解触发器相关概念及语法,供⼤家参考,具体内容如下概述本篇博⽂中主要探讨以下内容:什么是触发器触发器的应⽤场景触发器的语法触发器的类型案例数据:触发器的概念和第⼀个触发器数据库触发器是⼀个与表相关联的,存储的PL/SQL 语句。

每当⼀个特定的数据操作语句(insert update delete)在指定的表上发出时,Oracle⾃动执⾏触发器中定义的语句序列。

举个简单的例⼦:当员⼯表中新增⼀条记录后,⾃动打印“成功插⼊新员⼯”create or replace trigger insertStaffHintafter insert on xgj_testfor each rowdeclare-- local variables herebegindbms_output.put_line('新增员⼯成功');end insertStaffHint;触发器的应⽤场景复杂的安全性检查数据的确认数据库审计数据的备份和审计触发器的语法CREATE [OR REPLACE] TRIGGER trigger_name{BEFORE | AFTER }{INSERT | DELETE | UPDATE [OF column [, column …]]}[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]ON [schema.]table_name | [schema.]view_name[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}][FOR EACH ROW ][WHEN condition]PL/SQL_BLOCK | CALL procedure_name;其中:BEFORE 和AFTER指出触发器的触发时序分别为前触发和后触发⽅式,前触发是在执⾏触发事件之前触发当前所创建的触发器,后触发是在执⾏触发事件之后触发当前所创建的触发器。

Oracle存储过程及返回参数

Oracle存储过程及返回参数

1、基本语法创建存储过程,需要有CREATEPROCEDURE或CREATE ANY PROCEDURE的系统权限。

该权限可由系统管理员授予。

创建一个存储过程的基本语句如下:CREATE [OR REPLACE] PROCEDURE 存储过程名[(参数[IN|OUT|IN OUT] 数据类型...)]{AS|IS}[说明部分:参数定义、变量定义、游标定义]BEGIN可执行部分[EXCEPTION 错误处理部分]END [过程名];其中:可选关键字OR REPLACE 表示如果存储过程已经存在,则用新的存储过程覆盖,通常用于存储过程的重建。

参数部分用于定义多个参数(如果没有参数,就可以省略)。

参数有三种形式:IN、OUT和IN OUT;如果没有指明参数的形式,则默认为IN。

IN 定义一个输入参数变量,用于传递参数给存储过程OUT 定义一个输出参数变量,用于从存储过程获取数据IN OUT 定义一个输入、输出参数变量,兼有以上两者的功能例1,创建带输入输出参数的存储过程:create or replace procedure test_procedure(a in number, x out varchar2)isbeginif a >= 90 thenbeginx := 'A';end;end if;if a < 90 thenbeginx := 'B';end;end if;if a < 80 thenbeginx := 'C';end;end if;if a < 70 thenbeginx := 'D';end;end if;if a < 60 thenbeginx := 'E';end;end if;end test_procedure;执行结果:例2、创建参数为IN OUT 的存储过程create table EMP (EMPNO number , ENAME varchar2(32) );insert into EMP (EMPNO ,ENAME) values (10,'张三');insert into EMP (EMPNO ,ENAME) values (20,'小马');insert into EMP (EMPNO ,ENAME) values (30,'小米');insert into EMP (EMPNO ,ENAME) values (40,'小明');CREATE OR REPLACE FUNCTION GET_EMP_NAME(P_EMPNO NUMBER DEFAULT 10)RETURN VARCHAR2 ASV_ENAME VARCHAR2(32);BEGINSELECT ENAME INTO V_ENAME FROM EMP WHERE EMPNO = P_EMPNO;RETURN(V_ENAME);EXCEPTIONWHEN NO_DATA_FOUND THEN-- DBMS_OUTPUT.PUT_LINE('没有该编号雇员!');RETURN('没有该编号雇员!');WHEN TOO_MANY_ROWS THEN-- DBMS_OUTPUT.PUT_LINE('有重复雇员编号!');RETURN('有重复雇员编号!');WHEN OTHERS THEN--- DBMS_OUTPUT.PUT_LINE('发生其他错误!');RETURN('发生其他错误!');END;。

触发器与存储过程

触发器与存储过程

触发器与存储过程触发器(Trigger)是数据库中的一种特殊对象,它与一些特定的数据库事件相关联,并且当这个事件发生时,触发器可以在自动执行的过程中被触发。

而存储过程(Stored Procedure)则是一段预先编译好的SQL 语句的集合,它可以被保存在数据库服务器端,通过调用来执行。

触发器和存储过程都是数据库中的重要组件,它们都可以用于实现数据的自动化处理和一些复杂的业务逻辑。

但是它们在功能和使用方法上有一些不同之处。

首先,触发器的触发条件是事先设置好的,当该条件满足时才会被触发执行,而存储过程是主动调用执行的。

触发器通常与数据库中的表相关联,并且在表上的插入、更新或删除等事件发生时触发。

存储过程可以在任何时候被调用执行,无论是否有其他数据库事件发生。

其次,触发器通常用于实现数据的自动化处理,比如在插入新纪录时通过触发器自动计算一些字段的值,或者在删除记录时触发器做一些相关操作。

而存储过程则更倾向于实现业务逻辑的封装和复用,比如在一个库存管理系统中,可以使用存储过程来实现添加商品、修改商品信息、删除商品等操作。

此外,触发器由数据库引擎直接管理,它是与数据库表密切相关的一种对象,所以当表被删除或者修改时,相关联的触发器也会相应地被删除或修改。

而存储过程则是作为独立于表的对象存在,当数据库表被删除或修改时,存储过程不受影响。

在使用上,触发器和存储过程都可以用于实现一些相同的功能,但触发器更适合于在特定的数据库事件发生时执行自动化的操作,而存储过程更适合于实现复杂的业务逻辑和一些需要主动调用的场景。

总之,触发器和存储过程都是数据库中的重要组件,它们可以用于实现一些自动化的处理和复杂的业务逻辑。

它们在功能和使用方法上有一些不同之处,需要根据具体的需求来选择和使用。

oracle存储过程写法及调用

oracle存储过程写法及调用

Oracle存储过程的写法及调用如下:存储过程定义语法:```sqlCREATE [ORREPLACE] PROCEDURE procedure_name(arg1 [mode1] datatype1, arg2 [mode2] datatype2)IS [AS]PL/SQLBlock;```其中,`procedure_name` 是存储过程的名称;`arg1` 和`arg2` 是存储过程的参数,包括参数名、模式(IN、OUT、IN OUT)和数据类型;`PL/SQLBlock` 是存储过程的主体部分,包括一系列的SQL语句。

如果存储过程没有参数,只需要定义存储过程的主体部分即可。

例如:```sqlCREATE PROCEDURE out_time ISBEGINDBMS_OUTPUT.PUT_LINE('procedure_1......');END;```如果存储过程有参数,需要在定义时指定参数名、模式和数据类型。

例如:```sqlCREATE PROCEDURE procedure_2(v_i IN NUMBER, v_j OUT NUMBER) ISBEGINv_j := v_i * 2;DBMS_OUTPUT.PUT_LINE('procedure_2......' || v_i || '......' || v_j);END;```在这个例子中,`procedure_2` 接受两个参数`v_i` 和`v_j`,其中`v_i` 是输入参数,`v_j` 是输出参数。

在存储过程内部,对`v_i` 进行运算,并将结果赋值给`v_j`,然后输出运算结果。

调用存储过程的方法如下:```sqlBEGINprocedure_name(arg1 => value1, arg2 => value2);END;```其中,`procedure_name` 是存储过程的名称;`arg1` 和`arg2` 是存储过程的参数,需要指定相应的值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• 有0个或多个IN \OUT\IN OUT类型的参数。 • 不能被SQL语句直接调用,只能通过EXECUT命令或者 PL/SQL/程序块内部调用。 • 已经编译好的,所以在调用时不必再次进行编译,提高 了程序的运行效率。
3
存储过程的创建
• • • • • • • • • • CREATE [OR REPLACE] PROCEDURE Procedure_name [ (argument [ { IN | OUT |IN OUT }] Type, argument [ { IN | OUT | IN OUT } ] Type ] { IS | AS } <声明部分> BEGIN <执行部分> EXCEPTION <可选的异常处理程序> END;
• 示例代码如下:
CREATE OR REPLACE FUNCTION get_dname(p_deptno dept.deptno%TYPE) RETURN VARCHAR2 IS v_dname dept.dname%TYPE; BEGIN SELECT dname INTO v_dname FROM dept WHERE deptno = p_deptno; RETURN v_dname; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20003,'指定的部门不存在'); END;
在OEM中管理函数
添加函数
在OEM中管理函数
修改函数
在OEM中管理函数
删除函数
13.3 触发器(trigger)
13.3.1 13.3.2 13.3.3 13.3.4 触发器简介 DML触发器 INSTEAD OF触发器 在OEM中管理触发器
13.3.1 触发器简介
触发器也是一数据库对象,是命了名PL/SQL程序 块,被存储在数据库中。 常被用来完成由数据库的完整性约束难以完成 的复杂业务规则的约束。实现数据库数据一致性。 触发器和普通的过程、函数的执行机理不同: 函数、过程是需要用户显示调用才执行的; 触发器则是当某些事件发生时,由Oracle自动执 行。即:被某些事件触发而自动执行的。
相关概念
触发事件:引起触发器执行的事件。常是DML语句。 触发条件:由When子句指定的一个逻辑表达式。 触发对象:指触发器是创建在哪些表、视图上。 触发操作:触发器所要执行的PL/SQL程序。 触发时机:
• • • • BEFORE:在指定的事件发生之前执行触发器。 AFTER:在指定的事件发生之后执行触发器。 语句触发:以语句为单位。对于多行数据而言,只会执行一次。 行触发:以数据行为单位,符合触发条件时,对DML影响的每一行 都会执行一次。
Page

begin add_dept(60,'FINANCE','CHICAGO'); add_dept(DEPTNO=>70,dname=>'FINANCE',loc=>'CHICAGO'); add_dept(&deptno,'&dname','&loc'); --COMMIT; end;
Page 13
异常
Page
14
3. 带输出参数的存储过程
• 通过在过程中使用输出参数,可以将处理结 果返回到应用程序或调用环境。在过程中定 义输出参数时,需要OUT关键字修饰参数。 • 存储过程的输出参数可以为:标量类型、记 录类型和集合类型。 示例代码如下:
CREATE OR REPLACE PROCEDURE get_dept(p_deptno dept.deptno%TYPE, dname OUT dept.dname%TYPE,loc OUT dept.loc%TYPE) IS BEGIN SELECT dname,loc INTO dname,loc FROM dept WHERE deptno = p_deptno; EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('不存在该部门!'); END;
• 参数说明
– 参数的模式
• IN(默认参数模式)表示当过程被调用时,实参值 被传递给形参;IN模式参数可以是常量或表达式。 • OUT返回调用环境时,形参值被赋给实参。OUT模式 参数只能是变量,不能是常量或表达式。 • IN OUT表示当过程被调用时,实参值被传递给形参; 返回调用环境时,形参值被赋给实参。IN OUT模式 参数只能是变量,不能是常量或表达式。
Page 10
2. 带输入参数的存储过程
• 通过使用输入参数,可以将动态数据传递到存 储过程。定义存储过程时,可以使用IN关键字 显式指定输入参数,也可省略IN关键字。 • 存储过程的输入参数可以为:标量类型、记录 类型和集合类型。示例代码如下:
CREATE OR REPLACE PROCEDURE add_dept(deptno in dept.deptno%TYPE, dname dept.dname%TYPE,loc dept.loc%TYPE) IS BEGIN INSERT INTO dept VALUES(deptno,dname,loc); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN 标量类型 dbms_output.put_line('主键冲突,重新指定主键值'); END;
【例】创建示例过程ResetPwd,此过程的功能是 将表Users中指定用户的密码重置为111111:
CREATE OR REPLACE PROCEDURE ResetPwd ( VUserId IN NUMBER) AS BEGIN UPDATE Users SET UserPwd = ' 111111' WHERE UserId = VUserId; END;
Page
29
执行函数: BEGIN dbms_output.put_line('部门名: '|| get_dname(10)); END;
Page
30
Page
31
函数的删除
函数的删除 删除函数用DROP语句 语法格式为: DROP FUNCTION <函数名> 【例】删除函数GetPwd; DROP FUNCTION get_dname;
第13章 存储过程、函数和触发器
介绍Oracle数据库程序设计中经常会用到的3个概念,即存储过 程、函数和触发器。
13.1 存储过程
• • • • 存储过程的创建 存储过程的调用 存储过程的查看及删除 在OEM中管理存储过程
存储过程的特点
• 存储子程序是被命名的PL/SQL块,以编译的形式存储在数据库 服务器中,可以在应用程序中进行调用,是PL/SQL程序模块化 的一种体现。 • PL/SQL中的存储子程序包括存储过程和(存储)函数两种。 • 存储子程序是以独立对象的形式存储在数据库服务器中,因此 是一种全局结构,与之对应的是局部子程序,即嵌套在PL/SQL 块中的局部过程和函数,其存储位置取决于其所在的父块的位 置。 • 没有返回值。
• 对于func1的调用语句如下:
BEGIN dbms_output.put_line(func1); END;
Page
27
Page
28
13.2.3 函数返回类型
• 在函数的定义过程中,可以指定函数参数:输入(IN)、输出(OUT) 和输入输出(IN OUT)参数,函数参数的使用方式与过程参数完全一 致,允许的参数类型有:标量类型、记录类型和集合类型。
• 确定过程状态
• 查看过程文本
Page
20
在OEM中管理存储过程
添加存储过程
在OEM中管理存储过程
修改存储过程
在OEM中管理存储过程
删除存储过程
13.2 函数
• • • • 13.2.1 13.2.2 13.2.3 13.2.4 函数的创建 函数的调用 函数的查看及删除 在OEM中管理函数
1. 无参存储过程
• 下述代码创建无参存储过程,打印当前登 录用户的名字和系统时间。
CREATE OR REPLACE PROCEDURE proc_1 IS BEGIN dbms_output.put_line('欢迎你 '||USER); dbms_output.put_line('现在是: '||TO_CHAR(sysdate,'YYYY-mm-DD hh:MM:ss')); END;
Page 15
Page
16
• 调用带输出参数的过程时,需要使用变量 接收输出参数的数据值。
Page
17
4. 带输入输出参数的存储过程
• 通过在存储过程中使用输入输出参数,可以在调用 存储过程时输入数据到过程,在执行结束后返回结 果数据到调用环境或应用程序。当定义输入输出参 数时,需要指定参数模式为IN OUT。 • 下述代码通过定义带输入输出参数的过程,计算并 返回所输入两个数的和与差。
注意:在当前方案: 用户必须拥有CREATE PROCEDURE系统权限。 在其他方案:用户必须拥有CREATE ANY PROCEDURE系统权限。
Page
8
Page
9
• 调用无参存储过程: • EXECUTE. exec proc_1; • 在PL/SQL块中: 直接引用存储过程名。 BEGIN proc_1; END;
存储过程的调用
过程的调用
可以使用EXECUTE命令调用过程。如 EXECUTE ResetPwd(1);---将编号为1的用户密码重置 SELECT UserName,UserPwd FROM Users;
相关文档
最新文档