Oracle+PlSql存储过程 学习文档
Oracle数据库存储过程技术文档
Oracle数据库存储过程技术文档目录前言 (3)第一章oracle存储过程概述 (4)1.1 存储过程基本结构(PROCEDURE) (5)1.1.1创建存储过程 (5)1.1.2 存储过程删除 (6)1.1.3 调用存储过程 (6)1.2存储函数(FUNCTIONE) (7)1.2.1 创建存储函数 (8)1.2.2 删除存储函数 (8)1.3 包(package) (9)1.3.1 包的基本结构 (9)1.3.2 包的创建 (9)1.3.3 调用包中元素 (10)1.3.4 包的修改和删除 (10)第二章oracle存储过程基础――PL/SQL (11)2.1 pl/sql基础 (11)2.1.1 PL/SQL简介 (11)2.1.2 一个简单的PL/SQL块 (12)2.1.3 PL/SQL流程控制 (15)2.2 游标(CURSOR) (19)2.2.1 游标的概念 (19)2.2.2 游标的属性 (19)2.2.3 游标中FOR循环的使用 (21)2.2.4 带参数游标的使用方法 (22)2.3 动态SQL语句 (22)2.4 例外处理 (24)2.5 一个完整的PL/SQL实例 (26)第三章oracle存储过程讨论 (27)3.1 函数(FUNCTION) (27)3.1.1 用户函数创建,编译,删除 (27)3.1.2 参数传递 (28)3.2 存储过程 (30)3.3 包 (31)3.3.1 创建包 (31)3.3.2 删除包 (31)3.3.3 应用举例 (32)3.4 UTL_FILE包的使用 (34)3.4.1 文件控制: (35)3.4.2 文件输出: (35)3.4.3 文件输入: (36)3.4.4 应用举例 (36)4.1 Wrapper应用 (36)第四章存储过程运行环境 (37)4.1 存储过程以及PL/SQL执行环境 (37)4.1.1 SQL*PLUS环境 (37)4.1.2 Pro*c预编译环境 (38)4.2 存储过程调试方法 (39)4.2.1 SQL*PLUS环境中显示错误 (39)4.2.2 插入测试表调试存储过程 (40)4.2.3 DBMS_OUTPUT系统内置包 (41)附录一sql*plus工具 (42)附录1.1 sql*plus启动和关闭 (42)附录1.2 sql*plus 环境设置 (43)附录1.3 设置环境参数 (43)附录1.4 sqlplus命令的执行 (44)附录1.5 sql*plus编辑命令 (44)前言本文编写目的:本文对ORACLE存储过程,存储函数,包作了一个概括性的介绍,以实例为驱动介绍了存储过程,存储函数,包的语法,数据类型以及程序开发编写的方法。
oracle存储过程培训资料
23
光标属性
✓ 光标属性 每一个光标有四种属性
%FOUND %NOTFOUND %ROWCOUNT %ISOPEN
查询语句(FETCH语句)返回记录 查询语句(FETCH语句)无返回记录,用于循环退出条件 FETCH已获取的记录数 光标已打开标记
if not C%ISOPEN open C; end if;
%TYPE 属性 + 不必知道My_name的真正数据类型
+ 当数据库中列ename列定义改变时,数 据库运行时自动修改.
%ROWTYPE:
行类型
《PL/SQL程序设计》
12
PL/SQL程序设计
PL/SQL基础
PL/SQL 的记录类型 把逻辑相关的数据作为一个单元存储起来,在
Declare 段中定义record类型数据,使某一
WHERE empno=7934;
则,r_emp.v_ename,r_emp.v_job,r_emp.v_sal 已有
值;
给变量赋值: r_employee r_record;
r_employee.v_ename :=‘JACK’;
r_employee.v_job :=‘CLERK’; r_employee.v_sal := 890.98;
NUMBER的子类型,取值范围比INTEGER小
✓ NUMERIC NUMBER的子类型,与NUMBER等价
✓ REAL
NUMBER的子类型,存储实型数据
PL/SQL数据类型扩展
字符型
✓ VARCHAR2 存放可变长字符串,有最大长度限制
✓ CHAR 字符型,固定长度 ✓ LONG 长字符型 ✓ CLOB 大对象字符(Oracle8、Oracle8i)
数据库培训一:Oracle_PLSQL培训_存储过程
14
存储过程的调用
当在SQL*PLUS中调用存储过程时,需要使用CALL或EXECUTE 命令,而在PL/SQL块中可以直接引用。 当调用存储过程时,如果无参数,那么直接引用存储过程名;如 果存储过程带有输入参数,那么需要为输入参数提供数据值;如 果存储过程带有输出参数,那么需要使用变量接收输出结果;如 果存储过程带有输入输出参数,那么在调用时需要使用具有输入 值的变量。 当为参数传递变量或者数据时,可以采用位置传递、名称传递和 组合传递三种方法。
这里?表示输入参数,创建存储过程时用in表示输入参数
• •
仅有输出参数的过程:{ Call procedure_name(?,?...)}
这里的?表示输出参数,创建存储过程时用out表示输入参数
既有输入参数又有输出参数的过程 {call procedure_name(?,?...)}
这里的?有表示输出参数的,也有表示输入参数的
20
参数过程示例3
仅有输出参数的存储过程
create or replace procedure stu_proc2(pname out student.sname%type) as begin select sname into pname from student where sno=1; dbms_output.put_line(pname); end; 此种存储过程不能直接用call来调用,这种情况的调用将 在下面oracle函数调用中说明
17
参数
• SQL中调用存储过程语句: • call procedure_name();
• 调用时”()”是不可少的,无论是有参数还是无参数。
• 定义对数据库过程的调用时 无参数过程:{ call procedure_name} 仅有输入参数的过程:{call procedure_name(?,?...)}
plsql快速入门教程_包含存储过程
PL/SQL程序设计包游标。
第一章PL/SQL 程序设计简介 (3)§1.2 SQL与PL/SQL (3)§1.2.1 什么是PL/SQL? (3)§1.2.1 PL/SQL的好处 (3)§1.2.2 PL/SQL 可用的SQL语句 (4)§1.3 运行PL/SQL程序 (4)第二章PL/SQL块结构和组成元素 (5)§2.1 PL/SQL块 (5)§2.2 PL/SQL结构 (5)§2.3 标识符 (5)§2.4 PL/SQL 变量类型 (6)§2.4.1 变量类型 (6)§2.4.2 复合类型 (7)§2.4.3 使用%ROWTYPE (9)§2.4.4 PL/SQL 表(嵌套表) (9)§2.5 运算符和表达式(数据定义) (10)§2.5.1 关系运算符 (10)§2.5.2 一般运算符 (10)§2.5.3 逻辑运算符 (11)§2.6 变量赋值 (11)§2.6.1 字符及数字运算特点 (11)§2.6.2 BOOLEAN 赋值 (11)§2.6.3 数据库赋值 (11)§2.6.4 可转换的类型赋值 (12)§2.7 变量作用范围及可见性 (12)§2.8 注释 (13)§2.9 简单例子 (13)§2.9.1 简单数据插入例子 (13)§2.9.2 简单数据删除例子 (13)第三章PL/SQL流程控制语句 (14)§3.1 条件语句 (14)§3.2 CASE 表达式 (15)§3.3 循环 (15)§3.3 标号和GOTO (17)§3.4 NULL 语句 (17)第四章游标的使用 (19)§4.1 游标概念 (19)§4.1.1 处理显式游标 (19)§4.1.2 处理隐式游标 (23)§4.1.3 关于NO_DATA_FOUND 和%NOTFOUND的区别 (24)§4.1.4 游标修改和删除操作 (24)第五章异常错误处理 (26)§5.1 异常处理概念 (26)§5.1.1 预定义的异常处理 (26)§5.1.2 非预定义的异常处理 (27)§5.1.3 用户自定义的异常处理 (28)§5.2 在PL/SQL 中使用SQLCODE, SQLERRM (29)第六章存储函数和过程 (31)§6.1 引言 (31)§6.2 创建函数 (31)§6.3 存储过程 (35)§6.3.1 创建过程 (35)§6.3.2 调用存储过程 (36)§6.3.3 AUTHID (38)§6.3.4 开发存储过程步骤 (38)§6.3.5 删除过程和函数 (39)第七章包的创建和应用 (40)§7.1 引言 (40)§7.2 包的定义 (40)§7.3 包的开发步骤 (41)§7.4 包定义的说明 (41)§7.5 子程序重载 (49)§7.6 删除包 (51)§7.7 包的管理 (51)第八章触发器 (52)§8.1 触发器类型 (52)§8.1.1 DML触发器 (52)§8.1.2 替代触发器 (52)§8.1.3 系统触发器 (52)§8.2 创建触发器 (53)§8.2.1 触发器触发次序 (54)§8.2.2 创建DML触发器 (54)§8.2.3 创建替代(INSTEAD OF)触发器 (54)§8.2.3 创建系统事件触发器 (56)§8.2.4 系统触发器事件属性 (57)§8.2.5 使用触发器谓词 (57)§8.2.6 重新编译触发器 (57)§8.3 删除和使能触发器 (58)第一章PL/SQL 程序设计简介PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE 数据库进行访问。
Oracle的PLSQL和存储过程
PL/SQL也是一种程序语言,使用PL/SQL可以编写具有很多高级功能的程序:
(1). 能够使一组SQL语句的功能更具模块化程序特点; (2). 采用了过程性语言控制程序的结构; (3). 可以对程序中的错误进行自动处理,使程序能够在遇到错误的时候不会被中断; (4). 具有较好的可移植性,可以移植到另一个Oracle数据库中。
调用过程: exec test_procedure
总结
一.PL/SQL的基本语法? 二.存储过程怎么建,怎么用?
作业要求
1、建立一个存储过程,并传入一个参数, 向指定的表插入传入参数条数的记录数。 (会用到序列)
本节结束,继续努力!
Oracle-PLSQL和存储过程
求学客
主讲:风云张
版权声明
本课件由求学客网()编制, 仅供求学客的学员学习使用; 求学客享有本课件中的文字叙述、文档格式、插图、
照片等所有信息资料的版权,受知识产权法及版权
法等法律、法规的保护。任何个人或组织未经网新 集团的书面授权许可,均不得以任何形式使用本课
case的第1种用法:
PL/SQL示例
case col when 'a' then 1 when 'b' then 2 else 0 end case的第2种用法:
case when score <60 then 'd'
when score >=60 and score <70 then 'c' when score >=70 and score <80 then 'b'
Oracle+PLSQL存储过程大全
1)增删改查:
insert into 表名 列名 values 值列表;
delete FROM 表名 where .....
update 表名 set 更改值 where 条件;
SELECT ...... FROM ......where .....
as SELECT * FROM stuInfo where 1=2;
14)在已有的表结构中插入数据
insert into stuBak2
SELECT * FROM stuBak;
update stuBak set s_sex=’男’;
savepoint mark;
connect yangrs/yangrs@itjob;
SELECT * FROM scott.emp;
. 取消权限
connect scott/tiger@itjob;
revoke SELECT on emp FROM yangrs;
connect yangrs/yangrs@itjob;
create table stuInfo
(
s_id number(4),
s_name varchar2(10),
s_sex char(2),
s_age number(3),
s_birthday date default(sysdate),
s_note varchar2(50)
);
create table stuScore
(
stuid number(4),
scoreid varchar2(10),
score number(3)
plsql存储过程
fetch emp_cur into emp_record;
end loop;
close emp_cur;
exception
dbms_output.put_line('游标已经打开');
else
open emp_cur(edeptno);/t_line('游标已经被打开');
end if;
fetch emp_ cur into emp_record;
end if;
fetch emp_ cur into emp_record;
while emp_cur%found loop
dbms_output.put_line('员工信息:'||emp_recoud.empno||''||emp_record.ename)
[(para name[in|out|in out] type[……])]
is|as
begin
exception
end
/
例如:
create or replace procedure emp_pro(edeptno in number)//定义存储过程;
end loop;
close emp_cur;
exception
when others then
dbma_output.put_line('error');
end;
/
存储过程:
语法:
create [or replace] procedure 存储过程;
PLSQL--存储过程
PLSQL--存储过程 1.在开发程序中,为了⼀个特定的业务功能,会向数据库进⾏多次连接关闭连接(连接和关闭数据库是很耗费资源的),需要对数据库进⾏多次I/O读写,性能⽐较低。
如果把这些业务放到PLSQL中,在应⽤程序中只需要调⽤PLSQL就可以做到连接关闭⼀次数据库就可以实现我们的业务,可以⼤⼤提⾼效率。
2.ORACLE官⽅给出的解释:能够让数据库操作的不要放在程序中,在数据库实现基本不会出错,在程序操作中可能会出错,(如果在数据库中操作,可以有⼀点的⽇志恢复等功能) 3.语法1create or replace procedure过程名称[(参数列表)]is2begin345end过程名称;3.3⽆参存储1create or replace procedure p_a is2begin3 dbms_output.put_line('hello world');4end p_a;调⽤存储:1begin2-- Call the procedure3 p_a;4end;运⾏结果:在SQLPLUS通过exce调⽤3.4 带输⼊参数的存储过程1--查询并打印员⼯号7839的姓名和薪⽔2--存储过程,要求:调⽤的时候传⼊员⼯编号,⾃动控制打印3create or replace procedure p_query(i_empno IN emp.empno%TYPE) as4--声明变量5 v_ename emp.ename%TYPE;6 v_sal emp.sal%TYPE;7begin8SELECT ename,sal INTO v_ename,v_sal FROM emp WHERE empno = i_empno;9--打印变量10 DBMS_OUTPUT.PUT_LINE('姓名:'|| V_ENAME ||'薪⽔:'|| V_SAL);11end p_query;调⽤:1begin2-- Call the procedure3 p_query(7839);4end;结果:3.4带输⼊输出的存储过程1--查询并打印员⼯号7839的姓名和薪⽔2--存储过程,要求:调⽤的时候传⼊员⼯编号,⾃动控制打印3create or replace procedure p_shuchu(i_empno IN emp.empno%TYPE,o_sal OUT emp.sal%TYPE) as 4--声明变量5 v_ename emp.ename%TYPE;6 v_sal emp.sal%TYPE;7begin8SELECT sal INTO o_sal FROM emp WHERE empno = i_empno;9--打印变量10END ;调⽤:1DECLARE2--声明变量3 v_sal emp.sal%TYPE;4begin5-- Call the procedure67 p_shuchu(7839,v_sal);8 dbms_output.put_line('薪⽔:'||v_sal);9end;运⾏结果:。
oracle_存储过程培训材料)
•11
存储过程
存储过程操作符
+ *
/
|| 合并 如:sp_str1=“ASD”||”ERT” , 则: sp_str1=“ASDERT”
•12
存储过程
存储过程异常控制
exception when too_many_rows then DBMS_OUTPUT.PUT_LINE('返回值多于1行');
存储过程赋值语句 :=
realjob := ‘work’ ; Product_id := 100001 ; realname := 'Brunhilda'; Price := 3.1415;
this_day := TODAY;
•10
存储过程
存储过程变量
先声明且必须声明才能使用。 Begin end 块外声明的变量影响全局。 Begin end 块内声明的变量影响本 Begin end 。 变量声明必须在存储过程开头或者 Begin end 块的开头部分。
•28
存储过程
游标的使用
3. while 循环.
cursor c_postype(a in varchar2) is select bid ,bidname from dept where dname=a; open c_postype(a); begin fetch c_postype into v_postype,v_description; while c_postype%found loop fetch c_postype into v_postype,v_description ; end loop; close c_postype;
( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字;
oracle_PL_SQL学习笔记(sql与触发器、存储过程等)
oracle_PL_SQL学习笔记(sql与触发器、存储过程等)Oracle学习笔记李铁峰(2003-01-10)这篇笔记主要总结了机械工业出版社的《Oracle8 PL/SQL程序设计》的主要语法和内置函数部分1第一章PL/SQL简介1.1 块结构(Block)DECLARE --declarative section/*声明部分,声明变量(variables)、类型(types)、游标(cursors)和局部子程序*/BEGIN --executable section/*执行部分,放置过程性语句(procedural statement)*或SQL语句(SQL statemnet)。
*这是主体,是必须的。
*/EXCTPTION --exception section/*错误处理部分*/END; //“;”很关键,不要忘记1.2 变量和类型(variables and types)支持各种常用的数据库类型,还支持用户自定义类型,如表(table)、记录(record)。
还支持对象类型。
1.3 注释(comment)Oracle的PL/SQL支持"--"和“/* */”的注释风格。
2第二章PL/SQL基础2.1 PL/SQL块匿名块(anonymous)动态生成,只执行一次。
带名块(named)是带有标签的匿名块,动态生成,只执行一次。
子程序(subprogram)是存储在数据库内部的过程、函数和包。
可多次执行。
触发器(trigger)是存储在数据库内部的带名块,可多次执行。
由触发事件(triggering event)来触发。
2.2 词法单位(lexical unit)包括标识符(identifier)、分界符(delimiter)、文字(literal)和注释(comment)2.2.1标识符(identifier)PL/SQL对大小写不敏感。
最长30位。
a)保留字(reserved word)或关键字(keyword),保留字单独使用时是保留的,但可以出现在其他标识符的内部。
跟我学Oracle从入门到精通培训教程——PLSQL中的存储过程及应用
3、编译该存储过程
4、采用默认参数值方式执行带默认输入参数的存储过程例 (1)新建一个命令窗口并采用默认参数值方式执行该存储 过程
(2)在命令窗口中通过查询目标数据库表中的数据验证 该存储过程的执行结果
3、以指定的参数值方式执行带默认输入参数的存储过程 示例 (1)在调用存储过程时间给定具体的参数值
(2)在控制台中的 输出结果
( 3 )通过查询目标数据库表以验证该存储过程的执行结 果
五、在OEM中创建存储过程
1、登录OEM(http://teacher:1158/em/)
2 、选中在“管理”标签页中的“程序”栏中的“过程” 链接
3、点击“创建”链接,并输入存储过程的名称和存储过程 的代码
2创建数据库表someonetable3在plsqldeveloper中创建存储过程proceduredemo4本示例的存储过程的代码示例5编译该存储过程6在plsqldeveloper工具中执行存储过程块7在sql窗口中验证存储过程的执行结果二创建带输入参数的存储过程1创建带输入参数的存储过程2编程该存储过程体代码3编译该存储过程4采用默认参数值方式执行带默认输入参数的存储过程例1新建一个命令窗口并采用默认参数值方式执行该存储过程2在命令窗口中通过查询目标数据库表中的数据验证该存储过程的执行结果3以指定的参数值方式执行带默认输入参数的存储过程示例1在调用存储过程时间给定具体的参数值2在命令窗口中通过查询目标数据库表中的数据验证该存储过程的执行结果selectfromsomeonetable
(2)在命令窗口中通 过查询目标数据库表中 的数据验证该存储过程 的执行结果 select * from someOneTable;
4、在PL/SQL代码块中调用带默认输入参数的存储过程示例 (1)在SQL窗口中输入下面的PL/SQL代码块以调用该存储 过程
ORACLE_PLSQL存储过程教程
(1)SEQNAME.NEXTV AL里面的值如何读出来?可以直接在insert into test values(SEQNAME.NEXTV AL) 是可以用这样:SELECT tmp#_seq.NEXTV ALINTO id_tempFROM DUAL; 然后可以用id_temp(2)PLS-00103: 出现符号">"在需要下列之一时:代码如下:IF (sum>0)THENbeginINSERT INTO emesp.tp_sn_production_logV ALUES (r_serial_number, , id_temp);EXIT;end;一直报sum>0 这是个很郁闷的问题因为变量用了sum 所以不行,后改为i_sum>0(3)oracle 语法1. Oracle应用编辑方法概览答:1) Pro*C/C++/... : C语言和数据库打交道的方法,比OCI更常用;2) ODBC3) OCI: C语言和数据库打交道的方法,和ProC很相似,更底层,很少用;4) SQLJ: 很新的一种用Java访问Oracle数据库的方法,会的人不多;5) JDBC6) PL/SQL: 存储在数据内运行, 其他方法为在数据库外对数据库访问;2. PL/SQL答:1) PL/SQL(Procedual language/SQL)是在标准SQL的基础上增加了过程化处理的语言;2) Oracle客户端工具访问Oracle服务器的操作语言;3) Oracle对SQL的扩充;4. PL/SQL的优缺点答:优点:1) 结构化模块化编程,不是面向对象;2) 良好的可移植性(不管Oracle运行在何种操作系统);3) 良好的可维护性(编译通过后存储在数据库里);4) 提升系统性能;第二章PL/SQL程序结构1. PL/SQL块答:1) 申明部分, DECLARE(不可少);2) 执行部分, BEGIN...END;3) 异常处理,EXCEPTION(可以没有);2. PL/SQL开发环境答:可以运用任何纯文本的编辑器编辑,例如:VI ;toad很好用3. PL/SQL字符集答:PL/SQL对大小写不敏感4. 标识符命名规则答:1) 字母开头;2) 后跟任意的非空格字符、数字、货币符号、下划线、或# ;3) 最大长度为30个字符(八个字符左右最合适);5. 变量声明答:语法V ar_name type [CONSTANT][NOT NULL][:=value];注:1) 申明时可以有默认值也可以没有;2) 如有[CONSTANT][NOT NULL], 变量一定要有一个初始值;3) 赋值语句为“:=”;4) 变量可以认为是数据库里一个字段;5) 规定没有初始化的变量为NULL;第三章1. 数据类型答:1) 标量型:数字型、字符型、布尔型、日期型;2) 组合型:RECORD(常用)、TABLE(常用)、V ARRAY(较少用)3) 参考型:REF CURSOR(游标)、REF object_type4) LOB(Large Object)2. %TYPE答:变量具有与数据库的表中某一字段相同的类型例:v_FirstName studengts.first_name%TYPE;3. RECORD类型答:TYPE record_name IS RECORD( /*其中TYPE,IS,RECORD为关键字,record_name 为变量名称*/field1 type [NOT NULL][:=expr1], /*每个等价的成员间用逗号分隔*/field2 type [NOT NULL][:=expr2], /*如果一个字段限定NOT NULL,那么它必须拥有一个初始值*/... /*所有没有初始化的字段都会初始为NULLfieldn type [NOT NULL][:=exprn]);4. %ROWTYPE答:返回一个基于数据库定义的类型DECLAREv_StuRec Student%ROWTYPE; /*Student为表的名字*/注:与3中定一个record相比,一步就完成,而3中定义分二步:a. 所有的成员变量都要申明; b. 实例化变量;5. TABLE类型答:TYPE tabletype IS TABLE OF type INDEX BY BINARY_INTEGER;例:DECLARETYPE t_StuTable IS TABLE OF Student%ROWTYPE INDEX BY BINARY_INTERGER;v_Student t_StuTable;BEGINSELECT * INTO v_Student(100) FROM Student WHERE id = 1001;END;注:1) 行的数目的限制由BINARY_INTEGER的范围决定;6. 变量的作用域和可见性答:1) 执行块里可以嵌入执行块;2) 里层执行块的变量对外层不可见;3) 里层执行块对外层执行块变量的修改会影响外层块变量的值;第四章1. 条件语句答:IF boolean_expression1 THEN...ELSIF boolean_expression2 THEN /*注意是ELSIF,而不是ELSEIF*/... /*ELSE语句不是必须的,但END IF;是必须的*/ELSE...END IF;2. 循环语句答:1) Loop...IF boolean_expr THEN /* */EXIT; /* EXIT WHEN boolean_expr */END IF; /* */END LOOP;2) WHILE boolean_expr LOOP...END LOOP;3) FOR loop_counter IN [REVERSE] low_blound..high_bound LOOP...END LOOP;注:a. 加上REVERSE 表示递减,从结束边界到起始边界,递减步长为一;b. low_blound 起始边界; high_bound 结束边界;3. GOTO语句答:GOTO label_name;1) 只能由内部块跳往外部块;2) 设置标签:<<label_name>>3) 示例:LOOP...IF D%ROWCOUNT = 50 THENGOTO l_close;END IF;...END LOOP;<<l_close>>;...4. NULL语句答:在语句块中加空语句,用于补充语句的完整性。
存储过程 PL-SQL讲义 课件
存储过程单元
触发类型
行触发:for each row 语句触发:在默认的情况下,before和after为语句触
发,instead of 为行触发
新旧参数值引用限制
对lob建立的before和after型,只可以读old,不可以读 new或写old, new
对lob建立的instead of,只可以读old, new, 不可以写 old, new
存储程序单元
特点
有名字 可带参数和返回值 存储在数据字典中 可被多个用户使用
注:存储过程有时候泛指存储过程和存储函数,二者唯 一的差别是函数要给调用者返回一个单个的值, 但过程不返回值。
存储程序单元
参数构成
名称:合法的PL/SQL标识符 模式:IN(默认),OUT, IN OUT
注:函数中避免使用OUT和IN OUT,即返回 多个值。
如:DROP PROCEDURE Old_sal_raise; 所需权限(删除包同此)
DROP PROCEDURE DROP ANY PROCEDURE
存储过程单元
外部过程
Oracle服务器可以调用第三代语言写的过程。 这些过程的在独立于Oracle服务器的地址空 间里面运行。
存储过程单元
触发约束:布尔表达式,触发事件发生时,只有 此表达式为真才执行触发动作
触发动作:Action
存储过程单元
优点
灵活:触发事件多种多样 可以实现复杂的操作:触发动作任意,不似
foreign key, check
注意事项
避免级联 分布式不同节点的参照完整性用触发器,而同一
数据库内部则用主外码 尽量是用完整性约束,无法解决再用触发器
存储过程单元
第11章 PL-SQL和存储过程
Sequence_of_statements;
END LOOP;
2020/5/19
Database Principles 14
控制结构(续)
三、错误处理:
▪ 如果PL/SQL在执行时出现异常,则应该让程序在产生 异常的语句处停下来,根据异常的类型去执行异常处 理语句
▪ SQL标准对数据库服务器提供什么样的异常处理做出 了建议,要求PL/SQL管理器提供完善的异常处理机制
2020/5/19
Database Principles 6
PL/SQL的块结构(续)
❖ PL/SOL块的基本结构(续):
2.执行部分 BEGIN ------SQL语句、PL/SQL的流程控制语句 EXCEPTION ------异常处理部分 END;
2020/5/19
Database Principles 7
2020/5/19
Database Principles 11
控制结构(续)
一、 条件控制语句
IF-THEN, IF-THEN-ELSE和嵌套的IF语句
1. IF condition THEN Sequence_of_statements;
END IF 2. IF condition THEN
Sequence_of_statements1; ELSE
2020/5/19
Database Principles 2
• PL/SQL
– 扩展了控制语句,使得SQL具有程序模块结 构语言特征,包括异常处理
– PL/SQL语句与其它现代编程语言(C,java) 的语句类似
• 存储过程
– 用PL/SQL编写,编译、优化后存储在数据 库服务器中
PLSQL中的存储过程和函数
PLSQL中的存储过程和函数PLSQL中的存储过程和函数语法:create [or replace] procedure procedure_name[(parament1 [model1] datatype1,parament2 [model2] datatype2,...)]is|asPL/SQL Block;举例:create or replace procedure raise_salary(p_id in employees.employee_id%type)isbeginupdate employeesset salary = salary * 1.10where employee_id = p_id;end;PLSQL存储过程d额参数模式:+ in 默认模式,⽤于把值传给过程;参数可以是常量、变量、表达式;可以赋予默认值+ out 必须显式指定;⽤于把值从过程返回给调⽤环境;必须是个变量;不能赋予默认值+ in out 必须显式指定;⽤于把变量传给过程,并返回给调⽤环境;必须是个变量;不能赋予默认值参数传递⽅式 ( 按顺序传递 或者 使⽤=>符号传递 ) :create or replace procedure query_emp(p_id in employees.employee_id%type,p_name out st_name%type,p_salary out employeees.salary%type,p_comm out mission_pct%type )beginselect last_name,salary,commission_pctinto p_name,p_salary,p_commfrom employeeswhere employee_id = p_id;end query_emp;PLSQL存储函数:CREATE OR REPLACE FUNCTION get_sal(p_id in number) RETURN NUMBER ISv_salary NUMBER;BEGINSELECT salaryINTO v_salaryFROM employeesWHERE employee_id = p_id;RETURN v_salary;END get_sal;调⽤:select get_sal(100) from dual;。
Oracle_4_[plsql]-文档资料
9
(2)PL/SQL块语法 PL/SQL块语法结构如下: [DECLARE] declaration statements BEGIN executable statements [EXCEPTION] exception statements END PL/SQL块中的每一条语句都必须以分号结束,SQL语句可以多行,但分 号表示该语句的结束。一行中可以有多条SQL语句,他们之间以分号分隔。 每一个PL/SQL块由BEGIN或DECLARE开始,以END结束。注释由--标示。
Edit:JinYF Ver:1.0
8
1. 块结构
PL/SQL是一种块结构的语言,组成PL/SQL程序的单元是逻辑块, 一个PL/SQL 程序包含了一个或多个逻辑块,每个块都可以划分为三个 部分。 (1)块的三个部分 ①声明部分(Declaration section) 声明部分包含了变量和常量的数据类型和初始值。这个部分是由关键字 DECLARE开始,如果不需要声明变量或常量,那么可以忽略这一部分。 ②执行部分(Executable section) 执行部分是PL/SQL块中的指令部分,由关键字BEGIN开始,所有的可 执行语句都放在这一部分,其他的PL/SQL块也可以放在这一部分。 ③异常处理部分(Exception section) 这一部分是可选的,在这一部分中处理异常或错误,对异常处理的详细 讨论在后面进行。
为了减少这部分程序的修改 ,编程时使用%TYPE、 %ROWTYPE方式声明变量,使变量声明的类型与表中的保 持同步,随表的变化而变化,这样的程序在一定程度上具有 更强的通用性。
Edit:JinYF Ver:1.0
15
3、有效字符集
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracl e 存储过程目录Oracle 存储过程 (1)Oracle存储过程基础知识 (1)Oracle存储过程的基本语法 (2)关于Oracle存储过程的若干问题备忘 (4)1. 在Oracle中,数据表别名不能加as。
(4)2. 在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。
(5)3. 在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no datafound"异常。
(5)4. 在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错 (5)5. 在存储过程中,关于出现null的问题 (5)6. Hibernate调用Oracle存储过程 (6)用Java调用Oracle存储过程总结 (6)一、无返回值的存储过程 (6)二、有返回值的存储过程(非列表) (8)三、返回列表 (9)在存储过程中做简单动态查询 (11)一、本地动态SQL (12)二、使用DBMS_SQL包 (13)Oracle存储过程调用Java方法 (16)Oracle高效分页存储过程实例 (17)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的语法:可以使用create or replace procedure 语句,这个语句的用处在于,你之前赋予的excute 权限都将被保留。
IN, OUT, IN OUT用来修饰参数。
IN 表示这个变量必须被调用者赋值然后传入到PROCEDURE进行处理。
OUT 表示PRCEDURE 通过这个变量将值传回给调用者。
IN OUT 则是这两种的组合。
authid代表两种权限:定义者权限(difiner right 默认),执行者权限(invoker right)。
定义者权限说明这个procedure中涉及的表,视图等对象所需要的权限只要定义者拥有权限的话就可以访问。
执行者权限则需要调用这个procedure的用户拥有相关表和对象的权限。
Oracle存储过程的基本语法将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)例子:8.用pl/sql developer debug连接数据库后建立一个Test WINDOW在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试9.Pl/Sql中执行存储过程提交,类似于DP中FORMS_DDL语句,在此语句中str是不能换行的,只能通过连接字符"||",或着在在换行时加上"-"连接字符。
关于Oracle存储过程的若干问题备忘1.在Oracle中,数据表别名不能加as。
如:select a.appname from appinfo a;-- 正确select a.appname from appinfo as a;-- 错误也许,是怕和Oracle中的存储过程中的关键字as冲突的问题吧2.在存储过程中,select某一字段时,后面必须紧跟into,如果sel ect整个记录,利用游标的话就另当别论了。
select af.keynode into knfrom APPFOUNDATION afwhere af.appid=aid and af.foundationid=fid; -- 有into,正确编译select af.keynodefrom APPFOUNDATION afwhere af.appid=aid and af.foundationid=fid;-- 没有into,编译报错,提示:Compilation Error: PLS-00428: an INTO clause is expected in this SELECT statement3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。
可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select...into...4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错select keynode into kn from APPFOUNDATION where appid=aid and foundationid=fid;-- 正确运行select af.keynode into kn from APPFOUNDATION af where af.appid=appid and af.foundationid =foundationid;-- 运行阶段报错,提示:ORA-01422:exact fetch returns more than requested number of rows5.在存储过程中,关于出现null的问题create table A(id varchar2(50) primary key not null,vcount number(8) not null,bid varchar2(50) not null -- 外键);如果在存储过程中,使用如下语句:select sum(vcount) into fcount from A where bid='xxxxxx';如果A表中不存在bid="xxxxxx"的记录,则fcount=null(即使fcount定义时设置了默认值,如:fcount number(8):=0依然无效,fcount还是会变成null),这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:if fcount is null thenfcount:=0;end if;这样就一切ok了。
6.Hibernate调用Oracle存储过程用Java调用Oracl e存储过程总结一、无返回值的存储过程例: 存储过程为(当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。
二、有返回值的存储过程(非列表)注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。
三、返回列表由于Oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,1.建一个程序包。
如下:2.在Java里调用时就用下面的代码:在这里要注意,在执行前一定要先把Oracle的驱动包放到class路径里,否则会报错的。
在存储过程中做简单动态查询在存储过程中做简单动态查询代码 ,例如:一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL 语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现。
首先我们应该了解什么是动态SQL,在Oracle数据库开发PL/SQL块中我们使用的SQL 分为:静态SQL语句和动态SQL语句。
所谓静态SQL指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。
而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。
编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。
Oracle中动态SQL可以通过本地动态SQL来执行,也可以通过DBMS_SQL包来执行。
下面就这两种情况分别进行说明:一、本地动态SQL本地动态SQL是使用EXECUTE IMMEDIATE语句来实现的。
1、本地动态SQL执行DDL语句:需求:根据用户输入的表名及字段名等参数动态建表。
到这里,就实现了我们的需求,使用本地动态SQL根据用户输入的表名及字段名、字段类型等参数来实现动态执行DDL语句。
2、本地动态SQL执行DML语句。
需求:将用户输入的值插入到上例中建好的dinya_test表中。
执行存储过程,插入数据到测试表中。
在上例中,本地动态SQL执行DML语句时使用了using子句,按顺序将输入的值绑定到变量,如果需要输出参数,可以在执行动态SQL的时候,使用RETURNING INTO 子句,如:二、使用DBMS_SQL包使用DBMS_SQL包实现动态SQL的步骤如下:A、先将要执行的SQL语句或一个语句块放到一个字符串变量中。
B、使用DBMS_SQL包的parse过程来分析该字符串。
C、使用DBMS_SQL包的bind_variable过程来绑定变量。