一、pl/sql
pl/sql(procedural language/sql) 是Oracle在标准的sql语言上的扩展,pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许使用条件语句的循环语句,允许使用例外处理各种错误,这样使得它的功能更加强大。
优点↓
提高应用程序的运行性能
模块化的设计思想【分页的过程,订单的过程,转账的过程...只需要传入几个参数 就可以得到结果】
减少网络传输量
提高安全性
缺点↓
移植性差
开发工具↓
sqlplus:是Oracle公司提供的工具
编写一个存储过程,该过程可以向某表中添加记录
pl/sql developer:是用于开发pl/sql块的集成开发环境(ide),独立的产品,不是Oracle的附带品
编写一个存储过程,该过程可以删除某表记录
简单分类↓
pl/sql可以编写
块(编程)
过程(存储过程)
函数
触发器
包
二、编写规范
注释
单行注释--
select * from emp where empno = 7788; -- 取得员工信息
多行注释/*......*/
标识符号的命名规范
定义变量,用v_作为前缀 例v_sal
定义常量,用c_作为前缀 例c_rate
定义游标,用_cursor作为后缀 例emp_cursor
定义例外,用e_作为前缀 例e_error
三、pl/sql块介绍
块:pl/sql 的基本程序单元,编写pl/sql程序实际上就编写pl/sql块,要完成相对简单的应用功能,可能只需要编写一个pl/sql块。要想实现复杂的功能,可能需要在一个pl/sql块中嵌套其它的pl/sql块。
块结构:定义部分、执行部分、例外处理部分
如下↓
declear
/*定义部分------定义常量、变量、游标、例外、复杂数据类型*/
begin
/*执行部分------要执行的pl/sql语句和sql语句*/
exception
/*例外处理部分------处理运行的各种错误*/
end;
※注意:定义部分是从declare开始的,此部分是可选的;执行部分是从begin开始的,此部分是必须的;例外处理部分是从exception开始的,此部分是可选的
块实例 (1):只包括执行部分的pl/sql块
set serveroutput off -- 关闭输出选项
set serveroutput on -- 打开输出选项
begin
dbms_output.put_line(‘hello,world‘);
end;
相关说明:dbms_output是Oracle所提供的包(类似java开发包),该包包含一些过程,put_line是dbms_output包的一个过程。
块实例 (2):包含定义部分和执行部分的pl/sql
declare
v_ename varchar2(5); -- 定义字符串变量
begin
select ename into v_ename from emp where empno = &no;
dbms_output.put_line(‘员工姓名:‘||v_ename);
end;
相关说明: & 表示要接收从控制台输入的变量
块实例 (3):包含定义部分、执行部分、例外处理部分
为了避免sl/sql程序的运行错误,提高pl/sql的健壮性,应该对可能的错误进行处理
比如在实例(2)中,如果输入了不存在的应该*,应该做例外处理
相关说明Oracle事先预定义了一些例外,no_data_found是找不到数据的例外
-- 显示用户名和工资
declare
v_ename varchar2(5); -- 定义字符串变量
v_sal number(7,2);
begin
-- 执行部分
select ename,sal into v_ename,v_sal from emp where empno = &no;
-- 在控制台显示用户名和工资
dbms_output.put_line(‘员工姓名:‘ || v_ename || ‘工资:‘ || v_sal);
exception
-- 异常处理
when no_data_found then
dbms_output.put_line(‘员工*输入有误‘);
end;
四、过程
过程:用于执行特定的操作,建立过程时,可以指定输入参数(in),输入参数(out)。通过在过程中使用输入参数,可以将数据传递到执行部分;通过使用输出参数,可以将执行部分的数据传递到应用环境。在sqlplus中用create procedure命令来建立过程。
过程实例(1):编写一个过程,可以输入员工姓名、新工资 可修改员工的工资
create procedure sp_pro3(spName varchar2,newSal number) is
begin
-- 执行部分 根据员工姓名去修改工资
update emp set sal = newSal where ename = spName;
end;
过程实例(2):调用过程的两种方法
exec sp_pro3(‘scott‘,4567);
call sp_pro3(‘scott‘,4567);
过程实例(3):在java程序中调用一个存储过程
//演示java程序去调用Oracle的存储过程案例
package com.sp;
import java.sql.*;
public class TestOraclePro {
public static void main(String[] args){
try{
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.得到连接
//服务器IP:127.0.0.1
//端口号:1521
//数据库名称:MYORAL
Connection ct = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:MYORAL","scott","m123");
//3.创建CallableStatement
CallableStatement cs = ct.prepareCall("{call sp_pro3(?,?)}");
//4.给smith赋值
cs.setString(1,"smith");
cs.setInt(2,10);
//5.执行
cs.execute();
//6.关闭
cs.close();
ct.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}