- 浏览: 61562 次
- 性别:
- 来自: 成都
最新评论
-
云_不忘初心:
如果是可视化界面插入空值 该怎么办
oracle插入空值 -
aa00aa00:
例子通俗易懂,我已经成功运行起来了
jsp调用oracle存储过程分页
pl/sql是什么?
pl/sql(procedural language/sql)是oracle在标准的sql语言上的扩展,pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误,这样使得他的功能变得更加强大,使用pl/sql我们可以轻松的完成复杂的查询要求
学习pl/sql的知识铺垫:
<1.过程,函数,触发器是pl/sql编写
<2.过程,函数,触发器是在oracle中的
<3.pl/sql是非常强大的数据语言
<4.过程,函数可以在java程序用调用
pl/sql的优点
<1.提高应用程序的运行性能
<2.模块化的设计思想(分页的过程,订单的过程,转账的过程...)
<3.减少网络传入量
<4.提高安全性
pl/sql的缺点
移植性性不好
pl/sql的第一个小例子
创建表
SQL> create table mytest(
name varchar2(20),
pwd varchar2(30)
);
创建存储过程
SQL> create procedure sp_test is
begin
insert into mytest values('lms','m123');
end;
/
调用该过程的方式的两种方式
<1 exec 过程名(参数值1,参数值2......)
<2 call 过程名(参数值1,参数值2......) //注意这种方式在过程名后一定要带括号
pl/sql的编程基础单位是块
简单的分类如下
以块为基础主要可以编写四类东西:(存储)过程,函数,触发器,包
编写规范
<1注释
当行注释 --
select * from emp where empno=7788;--取得员工信息
多行注释 /*........*/
<2标识符号的命名规范
(1.当定义变量的时候,建议v_作为前缀 v_sal
(2.当定义常量的时候,建议用c_作为前缀 c_rate
(3.当定义游标的时候,建议用_cursor作为后缀 emp_cursor;
(4.当定义例外的时候,建议用e_作为前缀e_error
块
块(block)是pl/sql的基本程序单元。编写pl/sql程序实际上就是编写pl/sql快。要完成相对简单的应用工能,可能只需要编写一个pl/sql块;但是如果想要实现复杂的功能,可能需要在一个pl/sql块中嵌套其它的pl/sql块
块的结构示意图
pl/sql块由三个部分构成:定义部分,执行部分,例外处理部分
如下所示:
declare
/*定义部分----定义常量,变量,游标,例外,复杂数据类型*/
begin
/*执行部分----要执行的pl/sql语句和sql语句*/
exception
/*例外处理部分--处理运行的各种错误*/
end;
特别说明:
定义部分是从declare开始的,该部分是可选的
执行部分是从begin开始的,该部分是必须的
例外处理部分是从exception开始的,该部分是可选的
------输出示例------
set serveroutput on;--打开输出选项
begin
dbms_output.put_line('hello,word'); --调用包dbms_output下的存储过程put_line(?),这个类似于java中的类
end;
-------变量示例------
declare
v_ename varchar(20);--定义变量
begin
select ename into v_ename from emp where empno=&empno;
dbms_output.put_line('用户名是'||v_ename);
end;
declare
v_ename varchar(20);--定义变量
v_sal number(7,2);
begin
select ename,sal into v_ename,v_sal from emp where empno=&empno;
dbms_output.put_line('用户名是'||v_ename||';薪水是'||v_sal);
end;
--&控制台参数输入符号
--------异常处理--------
为了避免pl/sql程序运行错误,提高pl/sql的健壮性,应该对可能的错误进行处理,这个很有必要
比如,<1.在上面的例子中,当输入了不存在的雇员号时,应当做例外处理
< 2.有时出现异常,希望用另外的逻辑处理
相关说明:oracle预定义了一些异常,no_data_found表示找不到数据的例外
例如:
SQL> declare
v_ename varchar(20);--定义变量
begin
select ename into v_ename from emp where empno=&empno;
dbms_output.put_line('用户名是'||v_ename);
---异常处理
exception
when no_data_found
then dbms_output.put_line('朋友,你的编号输入有误');
end;
/
结果:朋友,你的编号输入有误
过程
过程用于执行特定的操作,当建立过程时,既可以输入参数(in),也可以指定输出参数(out),通过在过程中使用输出参数(out).通过在过程中使用输入参数,可以将数据传递到执行部分;通过使用输出参数,可以将执行部分的数据传递到应用环境,在sqlplus中可以使用create procedure命令来建立过程
----------------传参的存储过程-------------
编写带参数的存储过程:
create procedure sp_updateemp(updatename varchar2,newsal number) is
begin
update emp set sal=newsal where ename=updatename;
end;
调用命名存储过程命令:exec sp_updateemp('SCOTT','1111');
函数
函数用于返回特定的数据,当建立函数时,在函数头部必须包含return字句,而在函数体内必须包含return返回的数据。我么可以用create function来建立函数,例如:
create function sp_fun1(spname varchar2) return number is
yearsal number(7,2);
begin
--执行部分
select sal*12+nvl(comm,0)*12 into yearsal from emp where ename=spname;
return yearsal;
end;
---执行方式--
--SQL> var abc number;
--SQL> call sp_fun1('SCOTT') into:abc;
--SQL> print abc;
包
包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成。
<1可以使用create package命令来创建包:
包的规范只包含了过程和函数的说明,但是没有过程和函数的实现代码。包体用于实现包规范中的过程和函数
eg:
create package sp_package is
procedure sp_updateemp(updatename varchar2,newsal number); --存储过程
function sp_fun1(spname varchar2) return number ; --函数
end;
<2建立包体可以使用create package body命令
create or replace package body sp_package is
procedure sp_updateemp(updatename varchar2,newsal number) is
begin
update emp set sal=newsal where ename=updatename;
end;
function sp_fun1(spname varchar2) return number is
yearsal number(7,2);
begin
select sal*12+nvl(comm,0)*12 into yearsal from emp where ename=spname;
return yearsal;
end;
end;
--包的调用
--调用包sp_package下的updateemp()存储过程
--exec sp_package.sp_updateemp('SCOTT',1200);
触发器
触发器是指隐含的执行的存储过程,当定义触发器时,必须要指定触发的事件和触发的操作,常用的触发事件包括insert,update,delete语句,而触发器操作实际就是一个pl/sql块。可以使用create trigger来建立触发器
特别说明:
我们会在后面
----------标量--------
eg:根据员工编号输出雇员名称,工资,个人所得税
declare
c_taxrate number(3,2):=0.03; --税率,赋值用:=
v_ename emp.ename%type; --雇员姓名, 此种定义的方式是使v_ename的大小随着emp表中ename的大小而变化
v_sal number(7,2); --工资
v_taxsal number(7,2); --个人所得税
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
v_taxsal:=c_taxrate*v_sal;
dbms_output.put_line('员工姓名是:'||v_ename||' 个人工资是:'||v_sal||' 个人所得税是:'||v_taxsal);
end; 结果是:员工姓名是:SCOTT 个人工资是:1200 个人所得税是:36
复合变量(composite)
用于存放多个值的变量,主要包括几种:
<1. pl/sql记录
<2.pl/sql表
<3.嵌套表
<4.varray
--记录类型--
类似于c语言中的结构体
eg:
--定义一个pl/sql记录类型,类型包含三个数据v_name,v_sal,v_job
declare
type emp_record_type is record(
v_name emp.ename%type,
v_sal emp.sal%type,
v_job emp.job%type);
--定义了一个sp_record变量,该变量类型是emp_record_type
sp_record emp_record_type;
begin
select ename,sal,job into sp_record from emp where empno=&no; --将查询到的值一次性赋值到 sp_record 中
dbms_output.put_line('雇员姓名是:'||sp_record.v_name);
end;
--复合类型
类似于高级语言中的链表
--pl/sql表实例
declare
--定义了一个pl/sql表类型sp_table_type,该类型用于存放emp.ename%type类型的数据
--index by binary_integer表示下标是整数
type sp_table_type is table of emp.ename%type index by binary_integer;
--定义了sp_table_type类型的变量sp_table
sp_table sp_table_type;
begin
select ename into sp_table(2) from emp where empno=7788;
dbms_output.put_line('雇员姓名是:'||sp_table(2));
end;
--注意取得的可以随意插入到table中的任何地方
参照变量
参照变量是指用于存放数值指针的变量,通过使用参照变量,可以使得应用程序共享相同对象,从而降低占用的空间,在编写pl/sql程序时,可以使用游标变量(ref cursor)和对象类型变量(ref obj_type)两种参照变量类型
declare
--定义游标类型sp_emp_cursor
type sp_emp_cursor is ref cursor;
--定义一个游标变量test_cursor
test_cursor sp_emp_cursor;
--定义变量
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
--把teset_cursor和一个select结合
open test_cursor for select ename ,sal from emp where deptno=&no;
--循环取出
loop
fetch test_cursor into v_ename,v_sal;
exit when test_cursor%notfound;
dbms_output.put_line('雇员姓名是:'||v_ename||'薪资是:'||v_sal);
end loop;
close test_cursor;
end;
-----if语句;if--then-----
create or replace procedure sp_pro6(spName varchar2) is
v_sal emp.sal%type;
begin
select sal into v_sal from emp where ename=spName;
if v_sal<2000
then update emp set sal=sal*1.1 where ename=spName;
end if; --不能掉了这里
end;
-------二重if语句-if--then--else---
create or replace procedure sp_pro6(spName varchar2) is
v_comm emp.comm%type;
begin
select comm into v_comm from emp where ename=spName;
if(v_comm<>0)then
update emp set comm=comm+100 where ename=spName;
else
update emp set comm=comm+200 where ename=spName;
end if;
end;
----------多重条件分支-if--then--elsif---else---
create or replace procedure sp_pro7(spEmpno number) is
v_job emp.job%type;
begin
select job into v_job from emp where empno=spEmpno;
if v_job='PRESIDENT'then
update emp set sal=sal+1000 where empno=spEmpno;
elsif v_job='MANAGER'then
update emp set sal=sal+500 where empno=spEmpno;
else
update emp set sal=sal+200 where empno=spEmpno;
end if;
end;
-----------循环语句loop 至少执行一回--相当与while-----
create table Users(
uno number(3),
uname varchar2(10)
);
create or replace procedure sp_user(spUname varchar2) is
v_num Users.Uno%type:=1;
begin
loop
insert into Users values(v_num,spUname);
v_num:=v_num+1;
exit when v_num=11; --退出时的判断语句
end loop;
end;
-------------while循环--先判断再循环---相当于do-while-------------
create or replace procedure sp_user(spUname varchar2) is
v_num Users.Uno%type:=11;
begin
while v_num<=20 loop
--执行
insert into Users values(v_num,spUname);
v_num:=v_num+1;
end loop;
end;
---------------for 循环-------------
create or replace procedure sp_user(spUname varchar2) is
begin
for i in 21..30 loop --如果想从30到20反过来插入则在in后面加关键字 reverse
--执行
insert into Users values(i,spUname);
end loop;
end;
---------------goto语句-------一般不常用-----------
---------------null语句---null语句不会执行任何操作,并且会直接将控制传递到下一条语句-,使用null语句主要是为了提高代码的可读性-----------------
create or replace procedure sp_pro6(spName varchar2) is
v_sal emp.sal%type;
begin
select sal into v_sal from emp where ename=spName;
if v_sal<2000
then update emp set sal=sal*1.1 where ename=spName;
else
null;
end if; --不能掉了这里
end;
发表评论
-
oracle的dos启动命令
2012-05-23 10:48 1244每次启动oracle时都需要启动监听和实例,但是通过点击控 ... -
jsp调用oracle存储过程分页
2011-10-31 12:39 1998首先看下在oracle中一般 ... -
oracle例外处理
2011-10-30 17:10 716例外分类 oracle将例外分为预定义例外,非预 ... -
pl/sql进阶
2011-10-30 00:01 909------------------------分页----- ... -
oracle索引
2011-10-29 01:58 989索引是用于加速数据存取的数据对象,合理的使用索 ... -
oracle数据库管理-数据字典
2011-10-28 01:46 902数据字典是oracle ... -
oracle数据库管理-数据库用户及备份和导入
2011-10-27 18:40 5165每个oracle数据库应该至少有一名数据库管理员(db ... -
oracle事物
2011-10-26 14:43 813事物: 事物用于保证数据的一致性,他 ... -
oracle的一些小窍门语法
2011-10-26 12:15 6431.将旧表中的数据导入到一个新表中 create table ... -
oracle的分页与合并查询
2011-10-26 01:40 9971.orcale的分页 一共有三 ... -
oracle表的复杂查询
2011-10-25 11:27 767命名列的别名可以带as,也可以不带as,命名表的别名不能 带a ... -
oracle插入空值
2011-10-25 10:57 5773首先申明一点,空值和0是截然不同的两个概念 插入值时可以选 ... -
oracle表的简单查询
2011-10-25 01:07 1046desc emp显示emp表的结构 ... -
oracle表的创建与删除
2011-10-25 00:12 30151.表名和列名的命名规则 <1.长度不能超过30 ... -
oracle权限与角色
2011-10-24 22:39 707... -
sqlserver与orcale在数据库与用户的组织结构上的区别
2011-10-24 22:37 785... -
oracle文件操作命令spool以及显示和环境设置
2011-10-24 22:31 1846------spool文件操作命令------------ ... -
profile文件
2011-10-23 21:32 852profile是口令限制,资源限制的命令集合,当建立 ... -
oracle数据库的连接,用户的管理与权限的简单命令
2011-10-23 18:46 5859orcale命令结束符为分号 ----------- ... -
oracle的启动
2011-10-23 17:25 639第一步启动服务: 我的电脑-》管理-》服务-》启动两个服务 ...
相关推荐
### Oracle PL/SQL程序设计(第5版)(上下册)知识点概述 #### 一、PL/SQL编程基础 - **PL/SQL简介**:PL/SQL(Procedural Language for SQL)是Oracle数据库的一种内嵌式过程化语言,用于增强SQL的功能。它允许在SQL...
Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据库操作能力和PL/SQL的结构化编程特性,使得数据库开发者能够创建复杂的应用程序和数据库逻辑。在"Oracle PL/SQL实例精解 数据库建立代码"中,我们将深入探讨...
Oracle PL/SQL是一种强大的编程语言,它结合了SQL(结构化查询语言)的数据库操作功能与PL/SQL的程序设计特性,广泛应用于Oracle数据库的开发和管理。这本书"Oracle PL/SQL从入门到精通"的配套源代码,显然是为了...
Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据处理能力与PL的程序设计特性,是Oracle数据库系统中用于创建存储过程、函数、触发器和包的主要工具。在这个"Oracle PL/SQL实战(待续)"的主题中,我们将深入...
Oracle PL/SQL是一种强大的编程语言,它将关系数据库的强大功能与结构化编程的优点结合在一起,是Oracle数据库系统中不可或缺的一部分。在"Oracle PL/SQL 实例精解(第4版涵盖Oracle 11g)+源码脚本"中,读者可以深入...
ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括触发器、过程、函数、软件包、异常处理、游标、循环、分支、变量使用、数据库安装等关键知识点。 触发器是数据库中用来保证数据...
《Oracle PL/SQL程序设计(第5版)(套装上下册)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何...
Oracle PL/SQL 是Oracle数据库系统中的过程化语言,它结合了SQL查询功能和高级编程特性,使得开发者可以创建复杂的数据库应用程序。在Oracle 11g R2版本中,PL/SQL与SQL Developer一起使用,提供了丰富的开发环境来...
《Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发》是一本深入探讨Oracle数据库中的PL/SQL编程的专业书籍。PL/SQL是Oracle数据库特有的编程语言,它结合了SQL的查询能力与过程式编程语言的功能,使得数据库...
### Oracle PL/SQL Programming知识点概览 #### 一、书籍基本信息 - **书名**:Oracle PL/SQL Programming(第五版) - **作者**:Steven Feuerstein 和 Bill Pribyl - **出版日期**:2009年10月1日 - **出版社**:...
Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据库操作能力和Procedural Language的编程结构,用于在Oracle数据库环境中创建复杂的应用程序。在"Oracle PL/SQL实例精讲student数据库模式"中,我们将深入探讨...
Oracle PL/SQL是一种强大的编程语言,它将SQL与过程编程语言的特性相结合,为数据库开发提供了丰富的功能。在Oracle数据库环境中,PL/SQL是开发高效、可靠和可维护的数据库应用程序的关键工具。以下是对"Oracle PL/...
Oracle PL/SQL是一种强大的编程语言,它结合了SQL(结构化查询语言)的数据库操作能力和PL(过程化语言)的程序设计特性,是Oracle数据库系统中的核心组件之一。《精通Oracle PL/SQL》这本书深入探讨了这个语言的...
《Oracle PL/SQL by Example(4th Edition)》是一本专为Oracle数据库用户设计的PL/SQL编程指南,尤其适合那些希望通过实践学习这一强大的过程式语言的开发者。本书的第四版详细介绍了Oracle PL/SQL的各种核心概念和...
Oracle PL/SQL最佳实践 Oracle PL/SQL是一种强大的编程语言,用于在Oracle数据库环境中构建复杂的业务逻辑和数据处理任务。Steven Feuerstein,被誉为Oracle PL/SQL语言的大师,分享了他在这一领域的关键最佳实践和...
Oracle PL/SQL 语言是Oracle数据库系统中的一种高级编程语言,它是SQL的扩展,专为数据库管理和应用程序开发设计。PL/SQL集成了SQL的查询、操纵、定义和控制功能,并添加了过程化编程元素,使其成为数据库管理和开发...
Oracle PL/SQL 编程及最佳实践 Oracle PL/SQL 是一种高级编程语言,用于开发 Oracle 数据库中的存储过程、函数和触发器。PL/SQL language 提供了强大的编程能力,可以实现复杂的业务逻辑,并且与 Oracle 数据库紧密...
《ORACLE PL/SQL 程序设计(第五版)》是Oracle数据库开发领域的一本经典教程,专注于讲解如何使用PL/SQL这一强大的过程化语言进行数据库编程。这本书旨在帮助读者掌握PL/SQL的基本概念、语法和高级特性,以便在实际...