zoukankan      html  css  js  c++  java
  • PL/SQL语法

    PL/SQL语法

    由于pl/sql是编译后执行的,而sql语句是未经编译的,因此pl/sql语句在执行速度上更快,同时也减少了客户机和服务器的传输。

    基本结构

    DECLARE

       声明变量、常量、用户定义的数据类型以及游标等

       可选

    BEGIN

       主程序体

    EXCEPTION

        异常处理程序,当程序出现错误时,执行这一部分。

    END;

    声明部分、执行部分、异常处理部分。执行部分是必须的,其他俩部分可选。

    Pl/sql符号

    +     

    -     

    *     

    /     

    =    等于

    :=赋值 

    >    大于

    <    小于

    (

    )

    ;     语句结束

    %    属性指示符

       项目分隔符

    @    数据库连接指示符

    /     字符串分界符

       绑定变量指示符

    **    指数操作符

    <>    不等于

    =     不等于

    ~=      不等于

    ^=      不等于

    <=       小于等于

    >=       大于等于

    =    赋值

    =>     链接操作符

    ..      范围操作符

    ||      串连接

    --      单行注释

    /* */    多行注释

    常量和变量

    1、定义常量

           <常量名> constant <数据类型> = <>

          pass_Score constant INTEGER = 60

       2、定义变量

          <变量><数据类型>

          address VARCHAR220;-------------------初始值为NULL

    数据类型

       

        1 数字类型: number  pls_integer、  binary integer

        2 字符类型: varchar2char longnchar  nvarchar2

                    varchar2 和数据库中的varchar2不同,最大长度为32767

       

        3日期类型:date

        4 布尔类型   boolean---------------true   false  null

    5自定义类型

      type  <类型名> is <数据类型>

    Oracle中 允许定义两种数据类型   record(记录类型)和table(表类型)

        type   user_record is record(

             id number(5) ,

             name varchar2(20),

             sex char(1)

       )  

       使用:

         auser  user_record

         auser.id     auser.name  ..........

      另外,pl/sql还提供了两种特殊的变量   %TYPE%ROWTYPE,用来声明与表的列相匹配的变量和用户定义数据类型。前一个表示单属性的数据类型,后一个表示整个属性列表的结构

    上面例子可以改写为:

       type   user_record is record(

             Id   USERS.id%TYPE

                  Users是一个表

                Id的和 users表中的id类型相同

             Name USERS.NAME%TYPE

             Sex USERS.SEX%TYPE

         

       )  


    user_record  USERS%ROWTYPE;

    user_record.

    aaa EMPLOYEES%ROWTYPE

    type aaa is record(

        Employee_id number

        First_name varchar2()

    ............  

    )

    结构控制语句

             选择结构

            

             If ...then...     If(){}

             If...then...else...

             If...then...elseif

             End if

             case

           

     if    no  = 100    then

      

    insert into users()

    end if;

     if    no  = 100    then

      

    Insert into users();

    else

    Insert into.....

    end if;

    If score>90 then

      Score := score-5;

    else if score<60 then

    Score:=score+5;

    end if;

    case------类似于switch

    num=  case  name

           when 'A' then '0001'

           when 'B' then '0003'

           ....

           else 'no user'

           end;

    null结构

    Declare

    Num1 number;

    Num2 number;

    Res varchar210

    Begin

    If num1<num2 then

      Res:='yes'

    Else

       Res:='no';

    End if;

    End;

    Declare

    Num1 number;

    Num2 number;

    Res varchar210

    Begin

    If num1>num2 then

      Res:='no'

    Else

       Res:='yes';

    End if;

    End;

    num1=1 num2=null时,结果将是不同的

    所以要在程序中加入null值检查

    If    num1 is  null   or   num2 is null  then  res :=noresult

    Else if。。。。。。。。。。。

    循环结构

    1  loop...exit...end

     Control_var := 0;   循环因子

     loop--------------------------------------------循环开始

       If control_var>5 then

          Exit;

       End if;

    Control_var:=Control_var+1;

    .......

    End loop;------------------------------------------循环结束

    2  loop...exit when...end

     Control_var := 0;

    Loop

    Exit when  Control_var>5

    Control_var:=Control_var+1;

    End loop;

    3.while ...loop...end

        Control_var := 0;

       While Control_var<5 loop

    Control_var:=Control_var+1;

    ......

    End loop;

    4.for... In...loop...end

       

    for control_var in 0..5 loop

    .......

    End loop;

    declare

    control_var number;

    begin

      control_var:=0;

      

      for control_var in 0..5 loop

        

      dbms_output.put_line('123');

      

      end loop;

    end;

    游标   cursor

    类似于C语言中的指针,但指针的数据是定义好的,游标用select语句从表或视图中选出需要的数据,然后放入内存中,游标指向查询结果的首部。使用游标对此查询结果进行一些取值操作,随着游标的移动,也就访问到了所有的行。

    游标分为两种:

       隐示游标-----------不需要用户定义。

       显示游标-------  用户自己定义

      

    显示游标处理包括4个步骤:

    1 声明游标

    2 为查询打开游标

    3 将结果提取到pl/sql变量中

    4 关闭游标

    例子:

    declare

     user_id users.id%type;

     user_name users.name%type;

     user_age users.age%type;

     cursor user_cur is select * from users; -- 定义游标

    begin

      

       open user_cur; -- 打开游标

       

       fetch user_cur into user_id,user_name,user_age; --将第一行数据存入变量,游标后移

       

       loop --Exit when user_cur%NOTFOUND

            Exit when not user_cur%FOUND;---如果游标到结尾结束

            

            if user_age>20 then

              dbms_output.put_line('老人');

             else

               dbms_output.put_line('年轻人');    

             end if;  

             fetch user_cur into user_id,user_name,user_age;

             

         end loop;

         

         close user_cur;    

    end;

    隐式游标操作

    Select id ,name,sex into user_id,user_name,user_sex from users where id =100;

    游标的属性操作

    %FOUND-----是否找到游标

    %NOTFOUND---是否没找到游标

    %ROWCOUNT------游标行数

    %ISOPEN

    ----------------------------------------------------------------------------------------------------------------

    动态游标

    声明:

    TYPE<类型名>  IS  REF  CURSOR  RETURN <返回类型>

    Type user_cur_type is ref cursor return users%rowtype;

    User_cur   user_cur_type;

    也可不加return-------即,非受限游标变量

    Type user_cur_type is ref cursor;

    User_cur   user_cur_type;

    存储过程:

    Create or replace mycountin_sex in user.ssex%type

    As

    Out_num number;

    Begin

    If in_sex ='m' then

    Select count(sex) into out_num from users where sex='m';

    Dbms_output.put_line(out_num);

    Else

    Select count(sex) into out_num from users where sex='f;

    Dbms_output.put_line(out_num);

    End if;

    End count;

    执行

    Execute count(‘m’);

    参数类型:

    In类型参数

    Out类型参数

    In out 类型参数

    Create or replace produce doublein_num in number,out_num out numberas

    Begin

        Out_num:=in_num*2;

    End double;

  • 相关阅读:
    uva 12426 Counting Triangles 计算几何
    poj 1195 Mobile phones 二维树状数组
    poj 1039 Pipe 计算几何
    poj 3580 SuperMemo 数据结构
    poj 1031 Fence 计算几何
    ArcEngine 无法嵌入互操作类型
    IDL 读取显示HDF文件
    Sql Server 2005 Com+ 警告处理办法
    C# 自定义控件开发
    ArcEngine 获取HDF文件中的子文件
  • 原文地址:https://www.cnblogs.com/zls1024/p/9614453.html
Copyright © 2011-2022 走看看