码迷,mamicode.com
首页 > 数据库 > 详细

浅谈PL/SQL语言基础

时间:2015-09-19 16:38:47      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

  在前面的学习中,我们大部分接触的都是SQL语言,但是,在实现复杂操作的时候,SQL语言就无能为力了,这时候就需要引入新的语言,PL/SQL语言就是对SQL语言的扩展,可以实现存储过程,函数等的创建。下面是我对PL/SQL语言的总结,和大家分享一下。

一.基本结构

1.PL/SQL是一种块结构的语言,它将一组语句放在一个块中,一次性发送给服务器,当PL/SQL引擎分析收到PL/SQL语句块中的内容,把其中的过程语句由PL/SQL引擎自身去执行,把PL/SQL语句块中的SQL语句交给服务器的SQL语句去执行。

2.PL/SQL的块都是由声明变量(可省略),程序代码(必填)和异常处理(可省略)组成。    

  代码结构:declare

         变量声明

       begin

         程序体

       exception

         异常处理

       end;

  示例一

set serveroutput on;
--打开控制台输出,切记,不能在该语句后面写注释,否则报错。
declare 
  str varchar(20):=Hello World!;
begin
  dbms_output.put_line(str);
end;

3.PL/SQL中常量和变量的声明

  1>常量(使用constant关键字)

    示例:declare num constant int:=1;

  2>变量(参照(2)中的declare介绍)

4.特殊的变量类型

  1>%type

set serveroutput on;
declare
  cname bank.customername%type; --cname类型和bank表中的customername的类型一样
begin
  select customername into cname from bank where customername=李四;
  dbms_output.put_line(cname);
end;

  2>%rowtype

set serveroutput on;
declare
  recordbank bank%rowtype; --引用bank表中一行数据类型,即recordbank可以存放bank表中的一条数据
begin
  select * into recordbank from bank where customername=李四;
  dbms_output.put_line(recordbank.customername||存款为||recordbank.currentmoney);
end;

5.接收用户的输入

set serveroutput on;
declare 
  str varchar(20);
begin
  str:=&age;
  dbms_output.put_line(str);
end;

6.从查询结果中赋值(使用into关键字)

set serveroutput on;
declare
  cname bank.customername%type; --cname类型和bank表中的customername的类型一样
begin
  select customername into cname from bank where customername=李四;
  dbms_output.put_line(cname);
end;

 

二.流程控制语句

  PL/SQL的流程控制语句和我们常用的java等语言原理相同,除了使用时的方法略有不同,下面仅列出PL/SQL中使用方法和其他语言不同的流程控制语句。

1.条件控制语句
  (1)使用if
set serveroutput on;
declare 
  num int :=#
begin
  --判断if正确则执行then,否则执行else(elsif为嵌套判断)
  if num>0 then
    dbms_output.put_line(输入数字大于零);
  elsif num=0 then 
  --注意elsif,里面少一个e
    dbms_output.put_line(输入数字等于零);
  else
    dbms_output.put_line(输入数字小于零);
  end if;
end;
  (2)使用case
set serveroutput on;
declare 
  num int ;
  i int;
begin
  --有逻辑的从数值中做出选择
  num:=(case when 1=2 then 11 else 22 end);
  i:=(case num when 11 then 111 when 22 then 222 else 0 end);
  dbms_output.put_line(num||num||,i为||i);
end;
2.循环控制语句
  (1)循环控制,用判断语句执行exit
set serveroutput on;
declare 
  ssum int :=0;
  i int :=1;
begin
  loop 
    ssum := ssum+i;
    i:=i+1;
    if i>5 then
      exit;
    end if;
  end loop;
  dbms_output.put_line(1+2+3+4+5=||ssum);
end;
  (2)循环控制,当when为真时执行exit
set serveroutput on;
declare 
  ssum int :=0;
  i int :=1;
begin
  loop 
    ssum := ssum+i;
    i:=i+1;
    exit when i>5;
  end loop;
  dbms_output.put_line(1+2+3+4+5=||ssum);
end;
  (3)循环控制,当while为真时循环
set serveroutput on;
declare 
  ssum int :=0;
  i int :=1;
begin
  while i<=5 loop 
    ssum := ssum+i;
    i:=i+1;
  end loop;
  dbms_output.put_line(1+2+3+4+5=||ssum);
end;
  (4)已知循环次数的循环
set serveroutput on;
declare 
  ssum int :=0;
begin
  for i in 1..5 loop 
  --i不用声明定义,并且不用i:=i++;
    ssum := ssum+i;
  end loop;
  dbms_output.put_line(1+2+3+4+5=||ssum);
end;

三.异常处理

1.格式

  EXCEPTION
    WHEN <异常情况名> THEN
      <异常处理代码>
    WHEN <异常情况名> THEN
      <异常处理代码>
    WHEN OTHERS THEN
      <异常处理代码>

  示例

set serveroutput on;
declare 
  recordbank bank%rowtype;
begin
  select * into recordbank from bank where customername=王柳;
exception
  when no_data_found then
    dbms_output.put_line(没有找到该客户);
  when others then
    dbms_output.put_line(其他错误);
end;

2.常见异常

异常 说明
CURSOR_ALREADY_OPEN 用户试图重新打开已经打开的游标时出现
INVALID_CURSOR 在执行非法游标运算(如fetch一个尚未打开的游标)时出现
NO_DATA_FOUND 没有找到数据
TOO_MANY_ROWS 执行select语句时返回多行
VALUE_ERROR 在产生大小限制时出现,如变量中的列值超出变量的大小
ZERO_DIVIDE 以零做除数时出现

 

 

 

 

 

 

 

3.自定义异常

set serveroutput on;
declare
  myException exception;
begin
  update bank set customername = 王柳 where customername=李亮;
  if SQL%NOTFOUND then
    raise myException;
  end if;
exception
  when myException then
    dbms_output.put_line(SQLCODE|| errer ||SQLERRM);
end;

 

4.重新定义系统异常

set serveroutput on;
declare
  myException EXCEPTION;
begin
    update bank set customername = 王柳 where customername=李亮;
    if SQL%NOTFOUND then
        --调用系统的异常处理,抛出异常
        RAISE_APPLICATION_ERROR(-20001,can not found any row!);
    end if;
    EXCEPTION
        when myException then dbms_output.put_line(user errors);
        when others then
          dbms_output.put_line(Others   ||SQLCODE||   ||SQLERRM);
end;

 

浅谈PL/SQL语言基础

标签:

原文地址:http://www.cnblogs.com/zlbx/p/4808861.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!