一、oracle的pl/sql的概念
pl/sql是oracle在标准的sql语言上的扩展,不仅允许嵌入sql,还允许定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误,这样使得它的功能更强大。
1.过程、函数、触发器是pl/sql编写的
2.过程、函数、触发器是在oracle中
3.pl/sql是非常强大的数据库过程语言
4.过程、函数可以在java程序中调用
优点:增加程序的程序化编程、减少网络传输等、提高安全性、应用程序的运行性能
缺点:移植性不好
二、pl/sql的编程语言(包括函数、过程、触发器、包等)
简单例子:编写一个存储过程,该过程可以向某表中添加记录
create or replace procedure sp_prol is
begin
insert into mytest values('djw','m124');
end;
/
show error 查看错误
1) exec 过程名(参数值1,参数值2....)
2)call 过程名(参数值1,参数值2....)
1.pl/sql的编程最小的基础单位是块,用块可以编写过程、函数、触发器、包
2.编写规范:
定义变量为v_
定义常量为c_
定义游标_cursor
定义例外e_
3.块由3个部分构成:定义部分(declear),执行部分(begin)、例外部分(exception)
实例:
1.dbms_output是oracle所提供的包(类似java的开发包),该包包含一些过程,put_line就是dbms_output包的一个过程。
set serveroutput on;
begin
dbms_output.put_line('hello,word');
end;
/
2.写一个块如下,可以输入变量:
declare
v_name varchar2(5);
begin
select ename into v_name from emp where empno=&no;
dbms_output.put_line('雇员名'||v_name);
end;
/
3.写一个块如下,可以输入变量且输入例外:
declare
v_name varchar2(5);
begin
select ename into v_name from emp where empno=&no;
dbms_output.put_line('雇员名:'||v_name);
exception
when no_data_found then
dbms_output.put_line('朋友,你的编号输入有误');
end;
/
4.过程:过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out).通过在过程中使用输入参数,可以将数据传递到执行部分,通过在过程中输出参数,可以将执行部分的数据传递到应用环境。
实例:
1)请写过程,输入雇员的名,新的工资,修改雇员的工资
create procedure sp_pro3(spName varchar2,newSal number) is
begin
update emp set sal=newSal where ename=spName;
end;
/
2)如何调用过程两种方法
exec call
5.函数:函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句,而在函数体内必须return语句返回的数据,我们可以使用create function来建立函数
6.包:包用于在逻辑上组合过程和函数,由包规范和包体组成
----创建包sp_package
create package sp_package is
procedure update_sal (name varchar2,sal number);
function annual_income(name varchar2) return number;
end;
--创建具体的包体sp_package
create package body sp_package is
procedure update_sal(name varchar2,sal number)
is
begin
update emp set sal=sal where ename=name;
end;
function annual_income(name varchar2)
return number is
annual_salary number;
begin
select sal*12+nvl(comm,0) into annual_salary from emp
where ename=name;
return annual_salary;
end;
end;
/
7.定义和使用变量
标量:
1)v_name varchar2(10);
2)v_sal number(6,2);
3)v_sal2 number:=5.4---表示赋值,初始值
4)v_hiredate date
5) v_valid boolean not null default false;
存放最普通的变量:
1)declare
c_tax_rate number(3,2):=0.03;
v_ename varchar2(5);
v_sal number(7,2);
v_tax_sal number(7,2);
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
v_tax_sal:=v_sal*c_tax_rate;
dbms_output.put_line('姓名是:'||v_ename||'工资:'||v_sal||'交税'
||v_tax_sal);
end;
/
2)declare
c_tax_rate number(3,2):=0.03;
v_ename emp.ename%type;
v_sal emp.sal%type;
v_tax_sal number(7,2);
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
v_tax_sal:=v_sal*c_tax_rate;
dbms_output.put_line('姓名是:'||v_ename||'工资:'||v_sal||'交税'
||v_tax_sal);
end;
复合变量:用于存放多个值的变量
declare
type emp_record_type is record(
name emp.ename%type,
salary emp.sal%type,
title emp.job%type);
sp_record emp_record_type;
begin
select ename,sal,job into sp_record from emp where empno=7788;
dbms_output.put_line('员工名'||emp_record.name);
end;
参照变量:
参照变量是指用于存放数值指针的变量,通过使用参照变量,可以使得应用程序共享相同对象,从而降低占用的空间,在编写pl/sql程序时,可以使用游标变量和对象类型变量两种参照变量类型。
1)请使用pl/sql编写一个块,可以输入部门号,并显示该部门
set serveroutput on;
declare
--定义游标
type sp_emp_cursor is ref cursor;
--定义一个游标变量
test_cursor sp_emp_cursor;
--定义变量
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
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;
end;
if语句的用法
create or replace procedure sp_pro6(spName varchar2(10)) 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+sal*10% where ename=spName;
end if;
end;
3种循环(for循环省略)
create or replace procedure sp_pro6(spName varchar2) is
v_num number:=1;
begin
loop
insert into users values(v_num,spName);
exit when v_num=10;
v_num:=v_num+1;
end loop;
end;
--
create or replace procedure sp_pro6(spName varchar2) is
v_num number:=1;
begin
while v_num<=20 loop
insert into users values(v_num,spName);
v_num:=v_num+1;
end loop;
end;
自定义例外:
视图:视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。(视图是随表的变化而变化)
1)视图不占磁盘空间
2)视图有利于提高安全性,不同用户看到的视图不同
3)视图不能增加索引
4)视图可以简化复杂查询
5)视图和视图也可以进行关联查询
创建视图:
create view 视图名 as select xxx with read only