9.windows-oracle实战第九课--plsql

一、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

原文地址:https://www.cnblogs.com/dangjingwei/p/12141617.html