您的位置:首页 > 数据库

PL/SQL之一 基础语法

2017-10-04 10:16 357 查看

1.概述

  1.1定义
    PL/SQL表示SQL的过程式语言扩展,它是ORACLE RDBMSM的一部分,可以驻留在客户端和服务器端。
    任何两种环境下,任何PL/SQL块或子程序都是由PL/SQL引擎处理的,PL/SQL引擎负责处理和执行任意PL/SQL语句,并把SQL语句发送到SQL语句处理器。SQL语句处理器通常位于ORACLE服务器。

  1.2为什么用PL/SQL
     相较与独立的SQL语句(2*N),应用程序会将SQL语句合并为PL/SQL语句块,此PL/SQL语句块被发送到PL/SQL引擎,PL/SQL引擎会将SQL语句发送给SQL语句处理器,比独立的SQL语句占用网络流量要少,效率要高。

  1.3语句块结构
     语句块是PL/SQL执行最基本的单元,它有两种:匿名块、命名块(存储过程、触发器、函数、包)。匿名块没有名称,不会存储在数据库中,后期无法引用。
     语名块由声明部分、执行部分、异常处理组成,其中执行部分是必须部分。 

DECLARE  --声明部分(非必须)
     c_flag CONSTANT NUMBER(1):=1;
--常量
     v_name VARCHAR2(20); --变量
     i_age INTEGER; --变量
BEGIN   --执行部分
     BEGIN
         dbms_output.put_line('hello PL/SQL!');
     END;
EXCEPTION
       --异常处理部分 (非必须)
END;

  1.4 如何执行PL/SQL?
     每次执行匿名块时,代码会发送给位于服务器的PL/SQL引擎,在此进行编译。命名块只在创建或者修改时进行编译。编译过程包括语法检查绑定(编译器会给程序变量分配 存储地址,用于保存Oracle数据)、伪代码生成(伪代码是PL/SQL引擎的指令列表,对于命名块,伪代码存储在数据库,并且下次程序运行时会使用)。

2.数据类型、赋值

  Anchored数据类型:
    给变量设定的数据类型可以基于某种数据库对象。就称为Anchored声明,因为变量的数据类型依赖于底层对象的数据类型。
    语法: 变量名称  变量类型%type
  常见的数据类型:
    varchar2(长度):存储变长字符;参数是必需的,指定字符数据的最大长度,最大32767字节。它在数据库列中的最大宽度为4000字节。
    char(长度):存储固定长度字符(不足时使用空格填充),最大32767字节。它在数据库列中的最大宽度2000字节,默认值为1字节。
    number(p,s):存储任何大小的定点或浮点数。p指定数字的位数;s决定是否进行四舍五入(不指定时默认为0)。最大精度是38个十进制位。
    binary_interger:存储有正负之分的整数变量。它存储的变量是二进制格式(占用空间少,计算速度快)。可以存储-2147483747到2147483747之间的任何数值。主要用于超级索引PL/SQL表。
    DATE:存储定长的日期值。日期部分默认值是当月的第1天;时间部分默认值是零时。
    TIMESTAMP:它是DATE的扩展。存储定长的日期值,精度到秒的小数位,最高为十进制小数位第9位。
    BOOLEAN:存储TURE、FALSE、NULL。
    LONG:存储变长的字符串,它最大长度2GB。它可存储文本、字符数组、文档。不能在表达式、SQL函数、特定SQL子句(where、group by、connect by)中引用。
    LONG RAW:存储原始的二进制变量数据,最大不超过2GB。
    LOB:大型对象,它的四种类型:BLOB、CLOB、NLOB、BFILE。存储二进制对象,例如图片和视频文件,最大为4GB。BFILE是存储数据库之外的大型二进制文件(最大4GB)。
    ROWID:存储名为rowid的二进行制值。它唯一地标识每行数据,并提供访问特定数据行的最快捷方式。

  声明和初始化变量:
    变量名称  数据类型 赋值操作符 赋值;
    常量名称  constant  数据类型 赋值
131ec
操作符 赋值;
  
   变量初始化另一种语法:select item_name into 变量名称  from 表名;
   

3.条件控制语句

IF语句:
   形式一:

if 条件表达式  then
    处理1
end if;

       示例:

if v_num1>v_num2 then
    v_temp:=v_num1;
    v_num1:=v_num2;
    v_num2:=v_temp;
end if;

    形式二: 

if 条件表达式  then
    处理1;
else
    处理2;
end if;
 示例:

if mod(v_num,2)=0 then
    dbms_output.put_line('v_num is even number.');
else
    dbms_output.put_line('v_num is odd number.');
end if;

形式三: 

if 条件表达式  then
    处理1;
elsif

    处理2;
elsif 
    处理3;
else
    处理4;

end if;
 示例:
if v_num=0 then
    dbms_output.put_line('v_num is 0.');
elsif(v_num=1) then

    dbms_output.put_line('v_num is 1');
else
    dbms_output.put_line('v_num is others');

end if;

形式四:
    嵌套IF
    if  条件表达式   then
        语句;
    else
        if 条件表达式1 then
            语句1;
        else
            语句2;
        end if;
    end if; 

CASE语句:

   形式一:
        case 条件

   when 值1 then 处理1;
   when 值2 then 处理2;
   else 处理3;

end case;

   形式二:

case 
   when 条件表达式  then 处理1;
   when 条件表达式  then 处理2;
  else
    处理3;
end case;

4.迭代控制语句

简单循环:

declare
 v_numnumber:=10;
begin
      loop
            dbms_output.put_line('v_num:'||v_num);
            v_num:=v_num-1;
            ifv_num<1then
                  exit;
            endif;
      endloop;
end;

declare
 v_numnumber:=10;
begin
      loop
            dbms_output.put_line('v_num:'||v_num);
            v_num:=v_num-1;
            exit whenv_num<1;
      endloop;
end;

WHILE循环:

declare
 v_numnumber:=10;
begin
      whilev_num>=1loop
            dbms_output.put_line('v_num:'||v_num);
            v_num:=v_num-1;
      endloop;
end;

FOR循环:

 foriin1..10loop
            dbms_output.put_line('v_num:'||i);
      endloop;
  [--reverse:序列反转]
 foriinREVERSE1..10loop
            dbms_output.put_line('v_num:'||i);
      endloop;

CONTINUE语句:导致循环终止当前迭代,并且当continue的条件为true时,开始执行该循环的下一次迭代。

--continue 语句
declare
  v_numnumber:=10;
begin
 foriin 1..10loop
            if(i=5ori=6ori=7)then
   --i=5\6\7 时终止本次循环,开始执行此循环的下一次迭代。
                   continue;
            endif;
             continuewhen(i=5ori=6ori=7);
            dbms_output.put_line('v_num:'||i);
   endloop;
end;

--continue when 语句
declare
    v_numnumber:=10;
begin
       foriin 1..10loop
         continuewhen(i=5ori=6ori=7);
         dbms_output.put_line('v_num:'||i);
      endloop;
end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: