编写一个存储过程,该过程可以向某表中添加数据
.
1.
创建一个简单的表
create table mytest(
name varchar2(30),
passwd varchar2(30)
);
2.
创建过程
--replace 表示如果有sp_pro,则替换
create or replace procedure sp_pro is
begin
--执行部分
insert into mytest ('crazygrass','crazy');
end;
/
执行上面的过程时,会报错,可以同过 show error 来查看报错信息。更正如下:
--replace 表示如果有sp_pro,则替换
create or replace procedure sp_pro is
begin
--执行部分
insert into mytest values('crazygrass','crazy');
end;
/
如何调用该过程。
1)
exec
过程名(参数值
1
,参数值
2,….
)
2)
call
过程名(参数值
1
,参数值
2,….
)
执行以下
exec sp_pro;
-- 然后
select * from mytest;
-----
--
过程(存储过程)
-------
函数
块(编程)
-------
触发器
-------
包
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
块由三个部分构成:定义部分,执行部分,例外处理部分
如下所示:
declear
/*
定义部分
---
定义常量、变量、游标、例外、复杂数据类型
*/
begin
/*
执行部分
----
要执行的
pl/sq
和
sql
语句
*/
exception
/*
例外处理部分
---
处理运行的各种错误
*/
end;
declear
定义部分是可选的
exception
例外部分也是可选的
实例
1-
只包括执行部分的
pl/sql
块
打开输出选项
set serveroutput on
begin
dbms_output.put_line(‘hello’);
end;
实例
2—
包含定义部分和执行部分的
pl/sql
块
--有定义和执行部分的块
declare
--定义变量
v_name varchar2(5);
begin
--执行部分
select ename into v_name from emp where empno=&no;
--在控制台显示用户名
dbms_output.put_line('用户名是:'||v_name);
end;
当有两个或者多个变量需要赋值时,注意他们赋值的顺序。
--有定义和执行部分的块
declare
--定义变量
v_name varchar2(5);
v_sal number(7,2);
begin
--执行部分
select ename,sal into v_name, v_sal from emp where empno=&no;
--在控制台显示用户名
dbms_output.put_line('用户名是:'||v_name||' 工资:'||v_sal);
end;
相关说明:&表示从控制台输入。
-
实例
3-
包含定义部分,执行部分和例外处理部分
为了避免
pl/sql
程序的运行错误,提高
pl/sql
的健壮性,应该对可能的错误进行处理,这个很有必要:
-
1)
比如在实例
2
中,如果输入了不存在的雇员号,应当做例外处理
-
2)
有时出现异常,希望用另外的逻辑处理我们看看如何完成
1
的要求
--有定义和执行部分的块
declare
--定义变量
v_name varchar2(5);
v_sal number(7,2);
begin
--执行部分
select ename,sal into v_name, v_sal from emp where empno=&no;
--在控制台显示用户名
dbms_output.put_line('用户名是:'||v_name||' 工资:'||v_sal);
--异常处理
exception
when no_data_found then
dbms_output.put_line('No datas!');
end;
相关说明:
oracle
事先预定义了一些例外,
no_data_found
就是找不到数据的例外。
过程
过程用于执行特定的操作。当建立过程时,既可以指定输入参数(
in
),也可以制定输出参数
(out)
。通过在过程中使用输入参数,可以将数据传递到执行部分;通过使用输出参数,可以将执行部分的数据传递到应用环境。在
sqlplus
中可以使用
create procedure
命令来建立工程。
实例如下:
1
请考虑编写一个存储过程
,可以输入雇员号,新工资,可修改雇员的工资
2
如何调用过程有两种方法
3
如何在
java
程序中调用一个存储过程
特别说明:
对于过程我们会在以后给大家详细具体的介绍,现在先介绍个概念。
Java
调用存储过程:
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class TestOracleProcedure {
public static void main(String[] args) {
try {
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.获得连接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ora92","scott","tiger");
//3.创建CallableStatement
CallableStatement cs = conn.prepareCall("{call sp_pro4(?,?)}");
//4.给?赋值
cs.setString(1, "alex");
cs.setInt(2, 10);
//5.执行
cs.execute();
cs.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
print("ok!");
}
public static void print(Object o){
System.out.println(o);
}
}
函数用于放回特定的数据,当建立函数时,在函数头部必须包含
return
子句,而在函数体内必须包含
return
语句返回的数据。我们可以使用
create function
来建立函数,实际案例:
--输入雇员的姓名,返回雇员的年薪
create function sp_fun2(spName varchar2) return
number is annual number(7,2);
begin
--执行部分
select sal*12+nvl(comm,0) into annual from emp where ename=spName;
return annual;
end;
--通过sqlplus调用
Sql>var money number;
Sql>call sp_fun2(‘alex’) into:money;
Sql>print money;
包用于在逻辑上组合过程和函数,它是包规范和包体两部分组成。
1
我们可以使用
create package
命令来创建包:
--创建一个包
--声明该包有个过程
create package sp_package is
procedure update_sal(name varchar2,newSal number);
function annual_income(name varchar2) return number;
end;
2
建立包体可以使用
create package body
命令
--给包 sp_package 实现包体
create or replace package body sp_package is
procedure update_sal(name varchar2,newsal number)
is
begin
update emp set sal=newsal where ename=name;
end;
function annual_income(name varchar2)
return number is
annual number;
begin
select sal*12+nvl(comm,0) into annual from emp
where ename=name;
return annual;
end;
end;
3
如何调用包的过程或是函数
当调用包的过程或函数时,在过程和函数前需要带有报名,如果要访问其他方案的包,还需要在报名前方加上方案名。
如:
Sql> call
sp_package.update_sal(‘alex’,55);
特别说明:
包是
pl/sql
中非常重要的部分,我们可以在使用过程分页时,将再次体验它的威力。
触发器是指银行的执行的存储过程。当定义触发器时,必须要指定触发的事件和触发的操作,常用的触发事件包括
insert
,
update
,
delete
语句,而触发操作实际就是一个
pl/sql
块。可以使用
create trigger
来建立触发器
特别说明:
触发器
是非常非常重要的。
在编写
pl/sql
程序时,可以定义变量和常量;在
pl/sql
程序中包括有:
1.
标量类型
标量案例
:
1.
定义一个边长字符串
V_name
varhcar2(10);
2.
定义一个小数
范围
-9999..99~9999.99
v_sal number(6,2)
3.
定义一个小数并给一个初始值为
5.4:=
是
pl/sql
的赋值符号
V_sal2 number(6,2):=5.4;
4.
定义一个日期类型的数据
V_hiredate date;
5.
定义一个布尔变量,不能为空,初始值为
false
V_valid boolean
not null default fase;
输入员工的号,显示雇员姓名,工资,个人所得税(税率
0.03
)为例。
--create procedure tax is
declare
c_tax_rate number(3,2):=0.03;
--用户名
v_name varchar2(20);
v_sal number(7,2);
v_tax_sal number(7,2);
begin
select ename,sal into v_name,v_sal
from emp
where empno=&id;
--计算所得税
v_tax_sal := v_sal * c_tax_rate;
dbms_output.put_line('姓名:'||v_name||' 工资:'||v_sal||'交税:'||v_tax_sal);
end;
注意:定义标量时,如果取回的数据长度大于定义的长度,则会发生缓存区溢出。解决方法,更改为这样
v_name emp.ename%
type
;
不仅可以解决问题,而且还可以提高效率。
2.
复合类型
用于存放多个值的变量。主要包括以下几种:
1 pl/sql
记录(常用)
类似与高级语言的结构体
,需要注意的是当引用
pl/sql
记录成员时,必须要加记录变量作为前缀(记录变量
.
记录成员)如下:
--pl/sql 记录实例
declare
--定义一个pl/sql记录类型 emp_record_type,类型包含三个字段
type emp_record_type is
record(name emp.ename%type,
salary emp.sal%type,
title 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=7698;
dbms_output.put_line('姓名'||sp_record.name);
end;
3
.pl/sql
表(常用)
相当于高级语言中的数据。但是需要注意的是,在高级语言中数组的下标不能为负数,而
pl/sql
是可以为负数的,并且表元素的下标没有限制。实例如下:
--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_type;
begin
select ename into sp_table(0) from emp where empno=7698;
dbms_output.put_line('员工姓名:'||sp_table(0));
end;
一次只能返回一行,那么怎么解决这个问题呢?
那么就要使用我们的参照变量类型。
4.
参照类型
参照变量是指用于存放数值指针的变量。通过使用参照变量,可以使得应用程序共享相同的对象,从而降低占用的空间。在编写
pl/sql
程序时,可以使用游标变量(
ref cursor)
和对象类型变量两种参照变量类型。
1.
参照变量
-ref cursor
游标变量
使用游标时,当定义游标时不需要指定相应的
select
语句,但是当使用游标时(
open
时)需要指定
select
语句,这样一个游标就与一个
select
语句结合了。实例如下:
1
请使用
pl/sql
编写一个块,可以输入部门号,并显示该部门所有员工姓名和对应的工资。
--使用pl/sql编写一个块,可以输入部门号,并显示该部门所有姓名和工资。
declare
--定义一个游标
type sp_emp_cursor is ref cursor;
--定义一个游标变量
test_cursor sp_emp_cursor;
--定义变量
v_name emp.ename%type;
v_sal emp.sal%type;
begin
--执行
--把test_cursor和一个select结合
open test_cursor for select ename,sal from emp where deptno=&no;
--循环取出
loop
fetch test_cursor into v_name,v_sal;
--判断是否test_cursor为空
exit when test_cursor%notfound;
dbms_output.put_line('名字:'||v_name);
end loop;
end;
分享到:
相关推荐
以下是对"Oracle PL/SQL学习官方教材"中可能包含的主要知识点的详细解释: 1. **基础概念**:首先,教材会介绍PL/SQL的基本概念,包括块(Block)、变量(Variable)、常量(Constant)、数据类型(Data Types)和...
Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据处理能力与PL的程序设计...通过实践和学习"Oracle PL/SQL实战(待续)"的相关内容,我们可以提升在Oracle环境中解决问题的能力,更好地管理和优化数据库系统。
- **集合与记录**:学习如何使用PL/SQL中的集合和记录类型,这些结构可以帮助更高效地处理数据集。 - **游标**:介绍游标的使用方法,包括隐式游标和显式游标,以及如何利用游标遍历查询结果。 #### 四、PL/SQL中的...
Oracle PL/SQL是一种强大的编程语言,它结合了SQL(结构化查询语言)的数据库操作功能与PL/SQL的程序设计特性,广泛应用于Oracle数据库的开发和管理。这本书"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数据库管理技能的宝贵资源。通过解析和执行这些示例,开发者可以更好地理解和...
Oracle PL/SQL是一种强大的编程语言,它将关系数据库的强大功能与结构化编程的优点结合在一起,是Oracle数据库系统中不可或缺的一部分。在"Oracle PL/SQL 实例精解(第4版涵盖Oracle 11g)+源码脚本"中,读者可以深入...
ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括...这本书籍将为读者提供一个全面、系统的学习路径,帮助数据库管理员、开发人员深入理解并掌握ORACLE PL/SQL的强大功能和应用技巧。
"Oracle资料学习PL/SQL必备"这个主题涵盖了对Oracle数据库系统以及PL/SQL编程语言的学习资源,特别是针对那些希望深入理解并掌握PL/SQL的初学者或专业人士。PL/SQL的基础部分是了解和使用Oracle数据库的关键,它包括...
通过学习这些内容,开发者可以掌握Oracle PL/SQL的高级特性,从而设计和实现更高效、更稳定的数据库应用程序。无论你是数据库管理员、系统架构师还是开发人员,这本书都将为你提供宝贵的指导,助你在Oracle数据库...
Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据库操作能力和Procedural Language的编程结构,用于在Oracle数据库环境中创建复杂的应用程序。在"Oracle PL/SQL实例精讲student数据库模式"中,我们将深入探讨...
本书是一本逐步分解的,详尽的pl/sql编程教程,使用真实场景的试验、范例和练习来介绍读者所需的pl/sql编程技能,涵盖oracle 11g的最新特性。作者的写作手法源自于在哥伦比亚大学教授pl/sql编程技术的经验,深度...
通过深入学习Oracle 10g PL/SQL,不仅可以掌握数据库编程的基本技能,还能了解如何利用这些技能来设计和实现复杂的业务逻辑,优化数据库性能,以及更好地维护和管理Oracle数据库系统。本教程涵盖了所有这些关键知识...
Oracle PL/SQL最佳实践 Oracle PL/SQL是一种强大的编程语言,用于在Oracle数据库环境中构建复杂的业务逻辑和数据处理任务。Steven Feuerstein,被誉为Oracle PL/SQL语言的大师,分享了他在这一领域的关键最佳实践和...
oracle PL/SQL pdf学习资料oracle PL/SQL pdf学习资料oracle PL/SQL pdf学习资料oracle PL/SQL pdf学习资料oracle PL/SQL pdf学习资料
### Oracle PL/SQL Programming知识点概览 #### 一、书籍基本信息 ...通过阅读本书,读者可以快速掌握PL/SQL的基础知识,并学习如何利用Oracle Database 11g Release 2的强大功能来构建高效的应用程序。
### Oracle 9i PL/SQL程序设计笔记精要 #### PL/SQL基础知识概览 **标题与描述**:本文档围绕“Oracle 9i PL/SQL程序设计笔记”这一核心主题,深入探讨了PL/SQL语言的基础知识及其在Oracle 9i数据库环境中的应用。...
《Oracle PL/SQL by Example(4th Edition)》是一本专为Oracle数据库用户设计的PL/SQL编程指南,尤其适合那些希望通过实践学习这一强大的过程式语言的开发者。本书的第四版详细介绍了Oracle PL/SQL的各种核心概念和...