精通pl/sql编程

1.什么是plsql,有什么作用
plsql全称Procedure Language+SQL,
属于Oracle数据库特有编程语言.
它是在SQL语句基础上引入了变量,
分支,循环逻辑。
plsql程序可以存储在oracle数据库中
主要适用于完成大批量基于数据库
数据的运算处理。
2.plsql基本语法
  1)基本语法
  //匿名块,不能存在oracle中
  declare
    ... ...//声明定义变量(可省略)
  begin
    ... ...//主处理
  exception
    ... ...//异常处理(可省略)
  end;
  /


2)打印输出命令
   //在Oracle控制台打印输出消息
   dbms_output.put_line('消息');
   //默认显示消息功能关闭,需要开启
   set serveroutput on;


begin
  dbms_output.put_line('Hello World');
end;
/


 3)plsql注释
  -- 单行注释
  /*
   多行注释
  */


 4)变量定义和赋值
  declare
     msg varchar2(50);--默认null
     age number(3) := 0;--赋值
  begin
     dbms_output.put_line(msg);
     dbms_output.put_line(age);
  end;
  /
  注意::=为赋值语句;单个=为比较,
  判断是否相等.


 5)if分支
  if 条件1 then
    ....
  elsif 条件2 then
    ...
  else
    ...
  end if;


  declare
    sal number(7,2) := 0;
  begin
    if sal = 0 then
      dbms_output.put_line('待业');
    elsif sal < 3000 then
      dbms_output.put_line('低保户');
    elsif sal <8000 then
      dbms_output.put_line('屌丝');
    else
      dbms_output.put_line('高级屌丝');
    end if;
  end;
  /


 6)循环语句
  a.LOOP循环
  loop
    //循环执行的逻辑
    exit when 退出条件;
  end loop;
==============
  declare
    i number(2) := 1;
  begin
    loop
      dbms_output.put_line(i);
      i := i+1;
      exit when i>10;
    end loop;
  end;
  /
  
  b.while循环
   WHILE 满足条件 LOOP
     //循环逻辑
   END LOOP;


  declare
    i number(3) := 1;
  begin
    while i<=10 loop
      dbms_output.put_line(i);
      i := i+1;
    end loop;
  end;
  /


  3)for循环
  for 变量 in 数字集合 loop
    //循环执行逻辑
  end loop;
  提示:变量自动定义;集合仅限于
数字或游标
  ============
  begin
     for i in 1..10 loop
       dbms_output.put_line(i);
     end loop;
  end;
  /


  7)DML语句
 DML的SQL语句和以前学习的一致,
直接可以写在PL/SQL中
  create table p001(
  id number(5),
  name varchar2(20)
  );
  --循环插入10条记录
  begin
    for i in 1..10 loop
      insert into p001 (id,name)
       values (i,'scott'||i);
    end loop;
    commit;--提交事务
  end;
  /


  8)Select语句
  select 字段1,字段2
  into 变量1,变量2
  from 表
  where 条件
  提示:select语句仅适用于有且只有
一条记录的情况。如果查询多行结果
得需要使用游标技术。
  declare
    v_name varchar2(20);
  begin
    select name 
    into v_name
    from p001
    where id=5;
    dbms_output.put_line(v_name);
  end;
  /


  9)游标
  作用:查询多行结果的记录
  使用方法:
   declare声明定义游标
    CURSOR 游标名 IS select语句;
   begin使用方法
    //首先打开游标OPEN 游标名;
    //然后循环从游标取数据
     fetch 游标名 into 变量;
    //最后关闭游标CLOSE 游标名;
==================
declare
  cursor c_p001 is 
     select name from p001;
  v_name varchar2(20);
begin
  open c_p001;
  loop
    fetch c_p001 into v_name;
    exit when c_p001%NOTFOUND;
    dbms_output.put_line(v_name);
  end loop;
  close c_p001;
end;
/


 10)DDL语句
 createtable,drop table,truncate table
 alter table等命令。
 DDL必须采用动态编译执行方法执行。
begin
  execute immediate  
       'drop table p001';
end;



begin
   execute immediate 
    'create table p002 (id number(5))';
   execute immediate 
     'insert into p002 values (1)';
end;
/


 11)%TYPE和%ROWTYPE
  变量名 表名.字段%TYPE;
  v_name emp.name%TYPE;
  含义:定义一个v_name变量,类型与
emp表的name字段一致。


 declare
    v_name emp.name%type;
    v_sal emp.salary%type;
  begin
     select name,salary 
     into v_name,v_sal
     from emp
     where id=2;
     dbms_output.put_line(v_name);
     dbms_output.put_line(v_sal);
  end;
  /


  变量名 表名%ROWTYPE;
  含义:声明一个变量,变量类型为
记录类型。可以存储一行记录信息
  v_emp emp%rowtype;
 
  declare
    v_emp emp%rowtype;
  begin
    select *
    into v_emp
    from emp 
    where id=2;
    dbms_output.put_line(v_emp.name);
    dbms_output.put_line(v_emp.salary);
  end;
  /


====================
查询所有员工的name和sal
declare
   cursor c_emp is 
      select name,sal from emp;
begin
  for v_emp in c_emp loop
    dbms_output.put_line(
      v_emp.name||' '||v_emp.sal);
  end loop;
end;
/
===================
根据EMP表员工的工资信息,
计算个人应该缴纳多少税。
工资总额-3500
1档 <1500      超出部分*3%-0
2档 >=1500 && <4500  超出部分*10%-105
3档 >=4500 && <9000 超出部分*20%-555
其他        超出部分*25-1005


要求:编写一段PL/SQL显示EMP表中
员工名 工资 个税3部分值
declare
  cursor c_emp is 
      select * from emp;
  v_sal emp.salary%type;
  v_tax emp.salary%type;
begin
   --利用游标循环遍历每个EMP记录
   for v_emp in c_emp loop
   --循环中根据员工的salary计算个税
   v_sal := v_emp.salary-3500;
   if v_sal <= 0 then
      v_tax := 0;
   elsif v_sal < 1500 then
      v_tax := v_sal*0.03;
   elsif v_sal < 4500 then
      v_tax := v_sal*0.1-105;
   elsif v_sal < 9000 then
      v_tax := v_sal*0.2-555;
   else
      v_tax := v_sal*0.25-1005;
   end if;
   --循环中显示员工名 工资 个税3部分值
   dbms_output.put_line(
    v_emp.name||' '||v_emp.salary||' '||v_tax);
   end loop;
end;
/

需求:根据 EMP员工信息,
生成EMP_TAX纳税记录
ID
NAME
SALARY
TAX
TAX_DATE
create table emp_tax(
id number(10),
name varchar2(20),
salary number(7,2),
tax number(7,2),
tax_date date);


==============
declare
  cursor c_emp is 
      select * from emp;
  v_sal emp.salary%type;
  v_tax emp.salary%type;
begin
   --利用游标循环遍历每个EMP记录
   for v_emp in c_emp loop
   --循环中根据员工的salary计算个税
   v_sal := v_emp.salary-3500;
   if v_sal <= 0 then
      v_tax := 0;
   elsif v_sal < 1500 then
      v_tax := v_sal*0.03;
   elsif v_sal < 4500 then
      v_tax := v_sal*0.1-105;
   elsif v_sal < 9000 then
      v_tax := v_sal*0.2-555;
   else
      v_tax := v_sal*0.25-1005;
   end if;
   --写入纳税记录表中
   insert into emp_tax (id,name,salary,tax,tax_date)
     values (v_emp.id,v_emp.name,v_emp.salary,v_tax,sysdate);
   end loop;
   commit;
end;
/

对于oracle技术人员而言,怎么强调掌握pl/sql的重要性都不过分。但是,真正精通pl/sql绝非易事。事实上,在现有的oracle应用程序中充斥着太多质量不佳的pl/sql代码,它们要么没有充分利用oracle特有的功能,要么是在误用或者滥用。这种现象导致了许多对pl/sql本身能力不公正的批评。.    本书由全球oracle技术专家组织oaktable network的多位大师联手编写,是为pl/sql正名的名著。与市面上许多pl/sql图书只是纸上谈兵、局限于语法和功能本身不同,本书从实战出发,讲述如何正确、充分地运用语言特性,除了pl/sql的基本功能之外,也包括数据的高效处理、安全、触发器、高效的调试技术等。作者在讲解每一个特性 时都辅以经过实战检验的示例,更与读者分享了大量多年积累的独家经验。有本书在手,你将学会如何充分发挥pl/sql的巨大潜能,编写出可靠、高效且易于 维护的一流程序。... 作译者   Connor McDonald 世界著名的Oracle技术专家,Oracle认证专家,具有十多年的Oracle系统开发经验,以精深的PL/SQL造诣享誉业界。他的个人网站www.oracledba.co.uk是极具影响的Oracle技术资源。.   Chaim Katz Oracle认证专家,擅长数据库管理和PL/SQL开发,为各种Oracle技术期刊写过大量文章。   Christopher Beck Oracle公司资深技术专家,专攻核心数据库技术和Web应用开发。除本书外,他还与Joel R. Kallman和Tom Kyte等人合著了畅销书Beginning Oracle Programming。..   Joel R. Kallman Oracle公司软件开发总监.   David C. Knox 世界著名的Oracle安全专家,Oracle公司SolutioncEngineering集团的高级总监....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

crystalnsd

万水千山总是情,支持一下行不行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值