oracle存储过程函数和程序包

合集下载

oracle函数存储过程教程

oracle函数存储过程教程

declare param1 number:=25; param2 number:=35; begin swap(param1, param2); dbms_output.put_line('param1 = ' || param1); dbms_output.put_line('param2 = ' || param2); end;
名称表示法: 名称表示法:
begin update_students(in_name=>'柳青 in_age=>19); 柳青', 柳青 end;
8.2.7
存储过程的参数——参数的默认值 参数的默认值 存储过程的参数
有时,存储过程的参数有很多个。对于用户来说, 有时,存储过程的参数有很多个。对于用户来说,部 分参数并非必需,那么, 分参数并非必需,那么,在定义存储过程时应该为可选参数 设定默认值,以允许用户不为该参数传值。需要注意的是, 设定默认值,以允许用户不为该参数传值。需要注意的是, 默认值是仅对IN参数而言 参数而言, 默认值是仅对 参数而言,OUT和IN OUT参数没有默认值 和 参数没有默认值 范例8-17演示了如何使用 参数的默认值。 演示了如何使用IN参数的默认值 。范例 演示了如何使用 参数的默认值。
8.1.1 函数简介
1.函数与功能的划分 . 2.函数的参数 . 3.函数的返回值 .
8.1.2
1.创建函数 .
创建函数
create or replace function get_hello_msg return varchar2 as begin return 'hello world'; end get_hello_msg;

Oracle创建存储过程、创建函数、创建包

Oracle创建存储过程、创建函数、创建包

Oracle创建存储过程、创建函数、创建包⼀、Oracle创建存储过程1、基本语法create or replace procedure update_emp_sal(Name in out type,Name in out type, ...) isbeginend update_emp_sal;2、写⼀个简单的例⼦修改emp表的ename字段create or replace procedure update_emp(v_empno varchar2,v_ename varchar2) isbeginupdate emp set ename=v_ename where empno=v_empno;end update_emp;调⽤⽅法如下:SQL>exec update_emp('7935','test');2、有返回值的存储过程就写⼀个简单的返回empno=7935的sal值create or replace procedure emp_out_sal(v_empno in varchar2,v_sal out number) isvsal number(7,2);beginselect sal into vsal from emp where empno=v_empno;v_sal:=vsal;end;调⽤有返回值的过程SQL>var vsal numberSQL>exec emp_out_sal('7935',:vsal);PL/SQL procedure successfully completedvsal---------700SQL>var vsal numberSQL> call emp_out_sal('7935',:vsal);Method calledvsal---------700⼆、Oracle创建函数(function)1、基本语法规则如下:create or replace function (Name in type, Name in type, ...) return number isResult number;beginreturn (Result);end ;2、写⼀个简单的查询例⼦查询出empno=7935的sal值create or replace function ret_emp_sal(v_ename varchar2)return numberisv_sal number(7,2);beginselect nvl(sal,0) into v_sal from emp where lower(ename)=lower(v_ename);return v_sal;end;调⽤此函数:SQL>var vsla numberSQL> call ret_emp_sal('7935') into :vsal;Method calledvsal---------700三、Oracle创建包包⽤于组合逻辑相关的过程和函数,它由包规范和包体两个部分组成。

Oracle存储过程函数包

Oracle存储过程函数包

运行过程
• 可以在pl/sql块中调用,执行过程 • 可以直接在sql*plus中用execute执行存储过程
• 查询指定员工记录; CREATE OR REPLACE PROCEDURE QueryEmp( v_empno IN emp.empno%TYPE, v_ename OUT emp.ename%TYPE, v_sal OUT emp.sal%TYPE) AS BEGIN SELECT ename, sal INTO v_ename, v_sal FROM emp WHERE empno=v_empno; DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'的员工已经查到!'); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('发生其它错误!'); END QueryEmp;
2
子程序
• 子程序: PL/SQL的过程和函数统称为子程序 • 匿名块: 以DECLARE或BEGIN开始,每次提交都被编 译。匿名块不在数据库中存储并且不能直接从其他 PL/SQL块中调用。 • 命名块:除匿名块之外的其他块。包括过程,函数,包 和触发器。可以在数据库中存储并在适当的时候运行。 • PL/SQL 程序块、过程、函数和数据包中声明
• 计算指定部门的工资总和,并统计其中的职工数量。 CREATE OR REPLACE PROCEDURE proc_demo( Dept_no NUMBER DEFAULT 10, Sal_sum OUT NUMBER, Emp_count OUT NUMBER) IS BEGIN SELECT SUM(sal), COUNT(*) INTO sal_sum, emp_count FROM emp WHERE deptno=dept_no; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('发生其它错误!'); END proc_demo;

Oracle数据库系统应用开发实用教程电子课件 第8章 存储过程函数程序包与触发器-精选文档

Oracle数据库系统应用开发实用教程电子课件  第8章 存储过程函数程序包与触发器-精选文档

完成了任务7, 请尝试实训7
任务8
任务8.通过触发器在视图中插入数 据。
34
任务8
替代触发器是行级触发器。替代触发器用INSTEAD OF来 规定,它执行一个替代操作来代替对视图的操作,对视图 的操作最终会转换为基本表的操作。 问题:对视图view_emp_dept进行插入数据,结果报错。 这种情况该如何解决?(视图view_emp_dept的数据来 源于emp表的字段empno,ename,job, emp.deptno,条件是emp.deptno=dept.deptno)
③ 远程数据的复制。
语句级触发器
触发器的语句中未使用FOR EACH ROW子句。
语句级触发器与INSERT、DELETE、UPDATE或者组合上 进行关联。
语句触发器都只针对指定语句激活一次。
实训5
① 掌握语句级触发器的原理。 ② 语句级触发器的编写方法。 ③ 测试语句级触发器是否生效。
触发器示例体验
触发器概述
触发器是关系数据库系统提供的一项技术,当特定对 象上特定事件出现时,由系统自动触发执行的代码块。数 据库触发器能够执行的功能包括以下几方面: ① 自动生成派生数据。 ② 实现复杂的数据完整性规则。 ③ 实施更复杂的安全性检查。 ④ 提供审计和日志记录。
⑤ 启用复杂的业务逻辑。
触发器的基本语法规则
CREATE [OR REPLACE] TRIGGER 触发器名 触发时间 触发事件 ON 对象名 [REFERENCING_CLAUSE]
[FOR EACH ROW[WHEN ROW] TRIGGER_CONDITION]] PL/SQL 语句
规则说明
触发时间:指明触发器何时执行,取值有:

Oracle数据库的函数,存储过程,程序包,游标,触发器

Oracle数据库的函数,存储过程,程序包,游标,触发器

Oracle数据库的函数,存储过程,程序包,游标,触发器Oracle⾃定义函数函数的主要特性是它必须返回⼀个值。

创建函数时通过 RETURN ⼦句指定函数返回值的数据类型。

函数的⼀些限制:●函数只能带有 IN 参数,不能带有 IN OUT 或 OUT 参数。

●形式参数必须只使⽤数据库类型,不能使⽤ PL/SQL 类型。

●函数的返回类型必须是数据库类型Create function 函数名称 return 返回值类型 asBegin····End 函数名称;--创建不带参数函数,返回t_book中书的数量create function getBookCount return number asbegindeclare book_count number;beginselect count(*) into book_count from t_book;return book_count;end;end getBookCount;--函数调⽤set serveroutput on;begindbms_output.put_line('表t_book中有'||getBookCount()||'本书');end;--创建带参数函数,查找某个表的记录数create function getTableCount(table_name varchar2) return number asbegindeclare recore_count number;query_sql varchar2(300);--定义sql语句beginquery_sql:='select count(*) from '||table_name;--execute immediate:⽴即执⾏该SQL语句execute immediate query_sql into recore_count;return recore_count;end;end getTableCount;--函数调⽤set serveroutput on;begindbms_output.put_line('表中有'||getTableCount('t_book_log')||'条数据');end;CREATE OR REPLACE FUNCTION item_price_rage (price NUMBER)/* 参数、指定返回类型 */RETURN varchar2AS/* 定义局部变量 */min_price NUMBER;max_price NUMBER;BEGINSELECT MAX(ITEMRATE), MIN(ITEMRATE) INTO max_price, min_priceFROM itemfile;IF price >= min_price AND price <= max_price THENRETURN '输⼊的单价介于最低价与最⾼价之间';ELSERETURN '超出范围';END IF;END;匿名块执⾏函数p NUMBER := 300;MSG varchar2(200);BEGINMSG := item_price_range(p);DBMS_OUTPUT.PUT_LINE(MSG);END;SELECT查询调⽤(因为函数必须有返回值)SELECT myfunction FROM dual;Oracle存储过程存储过程(Stored Procedure),就是⼀组⽤于完成特定功能的SQL语句集,该SQL语句集经过编译后存储在数据库中。

在Oracle中使用存储过程和函数

在Oracle中使用存储过程和函数

Oracle中使用存储过程和函数摘要:存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数来执行它。

存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。

函数也是存储程序的一种,它建立后存储在数据库服务器中,用户可以直接调用。

熟练地使用存储过程能帮助DBA更好地管理数据库。

关键字:存储过程函数一.为什么要使用存储过程呢?因为课程设计中需要用到存储过程和函数,所以就选择了这个题目,好让自己对这个知识点更加熟悉。

在SQL*Plus中编写并执行PL/SQL块,PL/SQL块的代码存放在SQL*Plus的缓冲区中。

如果在SQL*Plus中执行其它SQL语句或者PL/SQL块,SQL*Plus的缓冲区中就会存放新的内容,原来的内容会被从缓冲区中清除出去。

如果希望PL/SQL块能被随时调用执行,并能与数据库中的其它用户共享,那就需要创建有名字的PL/SQL块,并经过编译与优化,存放在数据库中,这就是存储程序。

具体的优点如下:1.存储过程的能力大大增强了SQL语言的功能和灵活性。

存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

2.可保证数据的安全性和完整性。

3.通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。

4.通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。

5.再运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。

这种已经编译好的过程可极大地改善SQL语句的性能。

由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。

6.可以降低网络的通信量。

7.体现企业规则的运算程序放入数据库服务器中,以便集中控制。

8.当企业规则发生变化时在服务器中改变存储过程即可,无须修改任何应用程序。

企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序工作量非常之大(修改、发行和安装应用程序)。

Oracle(存储过程、存储函数、用程序调用)

Oracle(存储过程、存储函数、用程序调用)

Oracle (存储过程、存储函数、⽤程序调⽤)指存储在数据库中的供所有⽤户程序带哦⽤的⼦程序(PL/SQL )叫存储过程(不能返回值)、存储函数(可以通过return 语句返回值)1、存储过程为了完成特定功能的SQL 语句集,经编译后存储在数据库中。

(1)新建:(2)书写存储过程的代码:(3)编译运⾏代码:(4)调⽤存储过程:2、存储函数create or replace procedure raiseSalary(eno in number)ispsal emp.sal %type;beginselect sal into psal from emp where empno=eno;update emp set sal= sal + 100 where empno = eno ;dbms_output.put_line('前:'||psal||'后:'||(psal+100));end raiseSalary;存储函数与存储过程的结构类似,但是必须有⼀个return ⼦句,⽤于返回函数值。

(1)创建⼀个存储函数:(2)书写代码:(3)右键选择test:3、存储过程和存储函数的OUT(1)创建存储过程:(2)书写程序:查询员⼯的信息(3)测试结果:create or replace function queryEmpIncome(eno in number)return numberispsal emp.sal %type;pcomm m %type;beginselect sal,comm into psal,pcomm from emp where empno=eno;return psal*12+nvl(pcomm,0);end queryEmpIncome;create or replace procedure queryEmpInfeno(eno in number,pename out varchar2,psal out number,pjob out varchar2)isbeginselect ename,sal,job into pename,psal,pjob from emp where empno=eno; end queryEmpInfeno;4、java程序调⽤存储过程和存储函数(1)先在虚拟机中找到需要导⼊的jar包并进⾏导⼊:(2)书写⼀个⼯具类:package pers.zhb.utils;import java.sql.*;public class JDBCUtils {private static String driver = "oracle.jdbc.OracleDriver";private static String url = "jdbc:oracle:thin:@192.168.125.129:1521/orcl"; private static String user = "scott";private static String password = "tiger";static{try {Class.forName(driver);} catch (ClassNotFoundException e) {throw new ExceptionInInitializerError(e);}}public static Connection getConnection(){try {return DriverManager.getConnection(url, user, password);} catch (SQLException e) {e.printStackTrace();}return null;}public static void release(Connection conn, Statement st, ResultSet rs){ if(rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}finally{rs = null;}}if(st != null){try {st.close();} catch (SQLException e) {e.printStackTrace();}finally{st = null;}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}finally{conn = null;}}}}(3)创建测试类,调⽤存储过程和存储函数:public class Test {public void testProcedure(){String sql = "{call raiseSalary(?,?,?,?)}";Connection conn = null;CallableStatement call = null;try {conn = JDBCUtils.getConnection();call = conn.prepareCall(sql);call.setInt(1,7839);call.registerOutParameter(2, OracleTypes.VARCHAR); call.registerOutParameter(3, OracleTypes.NUMBER); call.registerOutParameter(4, OracleTypes.VARCHAR); call.execute();String name = call.getString(2);double sal = call.getDouble(3);String job = call.getString(4);System.out.println(name+"\t"+sal+"\t"+job);} catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.release(conn, call, null);}}public void testFunction(){String sql = "{?=call queryEmpIncome(?)}";Connection conn = null;CallableStatement call = null;try {conn = JDBCUtils.getConnection();call = conn.prepareCall(sql);call.registerOutParameter(1, OracleTypes.NUMBER); call.setInt(2, 7839);call.execute();double income = call.getDouble(1);System.out.println(income);} catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.release(conn, call, null);}}public static void main(String [] args){Test test=new Test();test.testFunction();}}。

oracle存储过程函数和程序包课件

oracle存储过程函数和程序包课件
oracle存储过程函数和程序包
带输入参数的过程3-3
• 分别输入两组数据来执行过程 ,结果如下:
oracle存储过程函数和程序包
带输出参数的过程3-1
• 实现功能:通过输出参数count来得到dept表 中的记录数
• 创建带输出参数的过程
CREATE OR REPLACE PROCEDURE sp_getcount (o_count OUT NUMBER) AS BEGIN
带IN OUT参数的过程2-2
• 执行过程:
DECLARE l_iotest varchar2(20):='COUNTING';
BEGIN sp_dept_dname_exist(l_iotest); DBMS_OUTPUT.PUT_LINE('部门名称ACCOUNTING'||l_iotest||'!');
存在 5. 使用函数查询部门信息 6. 使用程序包封装过程和函数
oracle存储过程函数和程序包
相关实践知识
• 从开始菜单中打开SQL*Plus工具,以SCOTT 用户的身份登录到数据库
oracle存储过程函数和程序包
不带参数的过程2-1
l 输入以下代码,创建一个最简单的过程 l 功能: 显示”Hello World!”
在 法 范中不包含RETURN子句
在可 行 句部分可以有RETURN 句,但其后不能加任何表达式
在 法 范中必 包含RETURN子 句
在可 行 句部分至少 包含一 条RETURN expression 句
可以用EXECUTE 句来 行
不能用EXECUTE 句来 行
oracle存储过程函数和程序包
oracle存储过程函数和程序包
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

学习改变命运,知 识创造未来
oracle存储过程函数和程序包
带IN OUT参数的过程2-2
l 执行过程:
DECLARE l_iotest varchar2(20):='ACCOUNTING';
BEGIN sp_dept_dname_exist(l_iotest); DBMS_OUTPUT.PUT_LINE('部门名称ACCOUNTING'||l_iotest||'!');
l_count NUMBER;
lBES创GELIN建ECT带COINUNOT(*U) INTT参O l_数co的unt过FR程OM,dep代t W码HE为RE:
dname=io_value; IF(l_count>0) THEN
io_value:='存在'; ELSE
io_value:='不存在'; END IF; END sp_dept_dname_exist;
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
l 输出结果:
带输出参数的过程3-3
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
带IN OUT参数的过程2-1
lC(ioR实_EvAa现TluEe功OINRO能RUETP:查LVAACR询ECHP某ARRO个2C)E部DU门RE名sp_称dep在t_d表namdee_pextis中t 是否 IS 已经存在
oracle存储过程函数和 程序包
学习改变命运,知 识创造未来
2021年2月17日星期三
回顾
l 游标就是指向上下文区的句柄或指针。 l 游标有两种类型:显式游标、隐式游标。 l 四个游标属性 :SQL%FOUND、SQL%
NOTFOUND、SQL%ROWCOUNT、SQL% ISOPEN l 显式游标的使用步骤 :4个 l 记录变量和%ROWTYPE l 带参数的游标 l 游标FOR循环(循环游标) l 游标中的更新和删除 l REF游标
小结:程序包的优点
l 使用程序包的优点:
Ø 信息隐藏 Ø 模块化 Ø 对多态的支持 Ø 性能更佳
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
过程返回结果集2-1
l 在Oracle中的过程不能象SQL SERVER那样 直接返回结果集,而必须借助于REF游标
l 程序包规范中的代码:
l (i_deptno NUMBER)
l RETURN VARCHAR2
l AS
l l_dname VARCHAR2(14);
l BEGIN
l SELECT dname INTO l_dname FROM dept WHERE deptno=i_deptno;
l RETURN l_dname;
l EXCEPTION
l WHEN NO_DATA_FOUND THEN
l
RETURN '错误!该编号的部门不存在!';
l END f_dept_getname_byno;
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
l 函数的调用及其输出结果 :
函数4-3
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
END;
l 输出结果: l 部门名称ACCOUNTING存在!
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
函数4-1
l 实现功能: 按部门编号查询出表dept中的部门名称
l 创建一个函数,代码为:
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
函数4-2
l CREATE OR REPLACE FUNCTION f_dept_getname_byno
在 5. 使用函数查询部门信息 6. 使用程序包封装过程和函数
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
相关实践知识
l 从开始菜单中打开SQL*Plus工具,以SCOTT 用户的身份登录到数据库
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
不带参数的过程2-1
输入以下代码,创建一个最简单的过程 功能: 显示”Hello World!”
CREATE OR REPLACE PROCEDURE sp_helloWorld AS BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World!'); END sp_helloWorld;
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
不带参数的过程2-2
l 执行过程 l EXECUTE sp_helloWorld;
句,但其后不能加任何表达式
RETURN expression语句
可以用EXECUTE语句来执行
不能用EXECUTE语句来执行
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
程序包5-1
l 利用程序包封装过程sp_dept_insert和函数 f_dept_getname_byno
l 程序包规范部分的代码:
l 执行过程:
VARIABLE test_cur REFCURSOR; EXECUTE pkg_dept.sp_dept_getall(:test_cur); PRINT test_cur;
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
OEM中管理过程、函数、程序包
l 请老师用浏览器打开OEM,演示在OEM中管
CREATE OR REPLACE PACKAGE pkg_dept AS
PROCEDURE sp_dept_insert (i_deptno NUMBER,i_dname VARCHAR2,i_loc VARCHAR2); FUNCTION f_dept_getname_byno(i_deptno NUMBER) RETURN VARCHAR2; END pkg_dept;
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
教学目标
l 掌握过程的用法 l 掌握函数的用法 l 理解过程与函数的相同点和不同点 l 理解程序包的概念并能熟练应用
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
工作任务
1. 用无参过程实现“Hello World!”程序 2. 用带输入参数的过程向表中插入记录 3. 用带输出参数的过程查询表中的记录数 4. 使用带输入输出参数的过程查询记录是否存
RETURN l_dname; EXCEPTION
WHEN NO_DATA_FOUND THEN RETURN '错误!该编号的部门不存在!';
END f_dept_getname_byno; END pkg_dept;
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
程序包5-4
l 执行程序包中的过程和函数:
函数4-4
l 删除函数 DROP FUNCTION f_dept_getname_byno
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
过程与函数小结2-1
l 共同点:两者的实质都是已命名的PL/SQL程 序块,即子程序,它们是子程序的两种类型, 存储在数据库中,可以从任何数据库客户端和 前台应用程序中调用它们。
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
程序包5-3
--函数f_num_range FUNCTION f_dept_getname_byno(i_deptno NUMBER) RETURN VARCHAR2 AS
l_dname VARCHAR2(14); BEGIN
SELECT dname INTO l_dname FROM dept WHERE deptno=i_deptno;
AS
BEGIN
INSERT INTO dept VALUES(i_deptno,i_dname,i_loc);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('添加失败!原因为:'||SQLERRM);
ROLLBACK;
END sp_dept_insert;
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
l 删除程序包:
程序包5-5
l 只删除程序包主体: DROP PACKAGE BODY pkg_dept;
l 删除整个程序包(规范+主体): DROP PACKAGE pkg_dept;
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
oracle存储过程函数和程序包
过程返回结果集2-2
l 程序包主体中的代码:
CREATE OR REPLACE PACKAGE BODY pkg_dept AS
PROCEDURE sp_dept_getall(dept_cur OUT deptcursor) IS BEGIN OPEN dept_cur FOR SELECT * FROM dept; END sp_dept_getall; END pkg_dept;
l 执行结果:
l 删除过程 l DROP PROCEDURE sp_helloWorld;
学习改变命运,知 识创造未来
3-1
l 实现的功能:向表dept中插入一条记录 l 创建带输入参数的过程,代码为:
学习改变命运,知 识创造未来
oracle存储过程函数和程序包
相关文档
最新文档