过程函数
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CISSST
Oracle 10g数据库管理课程
PL/SQL包的创建和使用
包的创建和使用:建立私有过程LOG_MESSAGE() 第3页
再建立函数: function get_emp_record(p_empno number) return emp%rowtype is l_emp_record emp%rowtype; begin log_message('Looking for record where empno= '||p_empno); select * into l_emp_record from emp where empno=p_empno; return l_emp_record; exception when NO_DATA_FOUND then return null; end get_emp_record;
CISSST
Oracle 10g数据库管理课程
PL/SQL包
包就是一个PL/SQL的相关对象的逻辑分组和单个对象存储在数据库中 的存储程序单元。
相关的PL/SQL对象可以是常量、变量、游标、异常、过程和函数。 包的组成: 1、包规范部分(也称为包的声明部分) 2、包主体部分
CISSST
Oracle 10g数据库管理课程
Chapter 5 过程、函数和程序包
授课教师: 原炜斌 QQ:448920091
CISSST
Oracle 10g数据库管理课程
目标(Objectives):
什么是过程 如何定义过程 如何定义函数 如何定义包 如何使用包
CISSST
Oracle 10g数据库管理课程
存储Hale Waihona Puke Baidu程序概述
PL/SQL为我们提供了一种叫做存储子程序的机制,允许在应用程序之 间共享PL/SQL代码。而且这些PL/SQL代码可以存储在数据库中。
CISSST
Oracle 10g数据库管理课程
创建函数
常见错误
忘记获取返回值 试图定义不能返回值的函数 定义没有返回数据类型的函数
CISSST
Oracle 10g数据库管理课程
创建函数
常见错误
SQL> exec first_function; begin first_function; end; ORA-06550: 第 1 行, 第 7 列: PLS-00221: 'FIRST_FUNCTION' 不是过程或尚未定义 ORA-06550: 第 1 行, 第 7 列: PL/SQL: Statement ignored
CISSST
Oracle 10g数据库管理课程
创建函数
创建函数
CREATE OR REPLACE FUNCTION f_line (ip_line_length IN NUMBER, ip_separator IN VARCHAR2) RETURN VARCHAR2 IS actual_line VARCHAR2(150); BEGIN FOR idx in 1..ip_line_length LOOP actual_line :=actual_line ||ip_separator; END LOOP; RETURN (actual_line); EXCEPTION WHEN OTHERS THEN dbms_output.put_line(SQLERRM); RETURN (null); END;
CISSST
Oracle 10g数据库管理课程
PL/SQL包的创建和使用
包的创建和使用:创建包的主体 程序示例:
create or replace package body employee_pkg as procedure print_ename(p_empno number) is l_ename emp.ename%type; begin select ename into l_ename from emp where empno=p_empno; dbms_output.put_line(l_ename); exception when NO_DATA_FOUND then dbms_output.put_line('Invalid employee number'); end print_ename; procedure print_sal(p_empno number) is l_sal emp.sal%type; begin select sal into l_sal from emp where empno=p_empno; dbms_output.put_line(l_sal); exception when NO_DATA_FOUND then dbms_output.put_line('Invalid employee number'); end print_sal; end employee_pkg;
CISSST
Oracle 10g数据库管理课程
PL/SQL包的创建和使用
包的创建和使用:建立私有过程 LOG_MESSAGE() 第1页
首先建立两张表: create table log_table( username varchar2(30), date_time timestamp, message varchar2(4000) );
CISSST
Oracle 10g数据库管理课程
创建函数
创建函数
CREATE OR REPLACE FUNCTION f_line (ip_line_length IN NUMBER, ip_separator IN VARCHAR2) RETURN VARCHAR2 IS actual_line VARCHAR2(150); BEGIN FOR idx in 1..ip_line_length LOOP actual_line :=actual_line ||ip_separator; END LOOP; RETURN (actual_line); EXCEPTION WHEN OTHERS THEN dbms_output.put_line(SQLERRM); RETURN (null); END;
创建函数
SQL> create or replace function no_return_type as 2 3 begin return null;
4
5
end;
/
Warning: Function created with compilation errors SQL> show errors;
CISSST
Oracle 10g数据库管理课程
创建函数
执行函数(1)
执行这个函数时,需要首先定义一个与函数具有相同返回值得变量,在调 用EXECUTE语句执行函数时,需要给这个变量赋值,然后再使用PRINT 命令输出结果。
CISSST
Oracle 10g数据库管理课程
创建函数
执行函数(2)——使用CALL命令
CISSST
Oracle 10g数据库管理课程
PL/SQL包的创建和使用
包的创建和使用:测试执行
--execute set serveroutput on; execute employee_pkg.print_ename(1234); --程序输出 Invalid employee number --execute execute employee_pkg.print_ename(7782); CLARK --execute execute employee_pkg.print_sal(7782); --程序输出 2450
Oracle 10g数据库管理课程
创建存储过程
创建存储过程
CISSST
Oracle 10g数据库管理课程
创建函数
函数与过程相似,也是数据库中存储的命名PL/SQL程序块。建立它们
遵循了相同的规则。它们的安全方式和参数传递也相同。 函数的主要独特特性是它必须返回一个值。这个值可以是NUMBER或 者VARCHAR2这样的单独数据类型,或者也可以是PL/SQL数组或者 对象这样的复杂数据类型。
PL/SQL包
包的组成:
1、包规范部分 包规范部分的声明被称为公共声明,它们的作用域是整个数据库会 话,能访问这种包的所有应用程序都能引用它们。 2、包主体部分 包主体中的声明、附加过程和函数都是私有的,因为只有包的创建 者才能访问到它们。
目的:实现信息隐藏和代码的可维护性。
CISSST
Oracle 10g数据库管理课程
begin show_it(bad_function); end; ORA-06503: PL/SQL: 函数未返回值 ORA-06512: 在"ANGEOS.BAD_FUNCTION", line 3 ORA-06512: 在line 1
CISSST
Oracle 10g数据库管理课程
创建函数
常见错误
存储子程序是存储在数据库中的一个命名的PL/SQL块。PL/SQL9i中支 持三种类型的存储子程序:
过程
函数 包
CISSST
Oracle 10g数据库管理课程
利益与优势
为什么在PL/SQL要使用存储子程序?我们来分析一下它的优势:
可扩展性 模块化 可重用性 可维护性 抽象和数据隐藏 安全性
CISSST
CISSST
Oracle 10g数据库管理课程
PL/SQL包的创建和使用
包的创建和使用:创建包的主体
[create [or replace] package body package_name {is | as} [pragma serially_reusable;] [cursor_body...] [public_procedure_implementation...] [public_function_implementation...] [begin sequence_of_statements] end [package_name]; ]
CISSST
Oracle 10g数据库管理课程
创建函数
常见错误
创建函数
create or replace function bad_function return number as begin null; end bad_function;
执行:
SQL> exec show_it(bad_function);
CISSST
Oracle 10g数据库管理课程
PL/SQL包的创建和使用
包的创建和使用:创建包规范部分
程序示例:
create or replace package employee_pkg as procedure print_ename(p_empno number); procedure print_sal(p_empno number); end employee_pkg;
Errors for FUNCTION ANGEOS.NO_RETURN_TYPE:
LINE/COL ERROR -------- -----------------------------------------------------------------------------------1/25 PLS-00103: 出现符号 "AS"在需要下列之一时: compress compiled wrapped ( return
PL/SQL包的创建和使用
包的创建和使用:创建包规范部分
create [or replace] package_name [authid {current_user | definer}] {is | as} [pragma serially_reusable;] [type_definition...] [constant_declaration...] [variable_declaration...] [exception_declaration...] [cursor_declaration...] [procedure_header...] [function_header...] end [package_name];
create table temp_table( n number );
CISSST
Oracle 10g数据库管理课程
PL/SQL包的创建和使用
包的创建和使用:建立私有函数 get_emp_record(p_empno number) 第2页
create or replace package body employee_pkg as procedure log_message(p_message varchar2) is pragma autonomous_transaction; begin insert into log_table(username,date_time,message) values(user,current_date,p_message); commit; end log_message;