• 第四天、PL/SQL基础


    2008/03/20

    PL/SQL基础

    1.PL/SQL基础

    2.PL/SQL块结构
    DECLARE
    ....变量声明
    BEGIN
    ....
    EXCEPTION
    ....
    END;

    变量声明的内容
    赋变量适当的名称,变量正确的数据类型,定义变量,控件变量范围
    命名规则
    由字符开头,可以包含数了,下划线,$,#等,长度1-30,大小写不区分,不能是系统关键字
    例:
    DECLARE
    X VARCHAR2(10);  定义变量区域
    BEGIN
    X:='THIS IS...';   变量赋值
    DBMS_OUTPUT.PUT_LINE('X的值为:'||X);  ||是连接字符,不用转换类型
    END        结束
    /         结束,并执行
    默认是不输也的,我们可以用SET
    SET SERVEROUTPUT ON SIZE 10000  //开启输出,输也量为10000
    这时候重新L,执行就能输出结果了。
    save c:\plsql.txt  保存起来上面的块。
    DBMS_OUTPUT.PUT('X的值为:'||X);  意思是不输出

    --行注释内容
    /*..块注释....*/
    X varchar2(10):='abce';定义并赋值

    @ c:\sqlplus.txt 执行文件中的内容

    3.分支语句的使用
    一、IF分支
    IF ... THEN
    ....
    ELSE IF ....THEN
    ....
    ELSE
    .....
    END IF

    例:
    DECLARE
    a number;
    b varchar2(10);
    BEGIN
    a:=2;
    IF a=1 THEN
    b:='a';
    ELSIF a=2 THEN
    b:='b';
    ELSE
    b:='C';
    END IF;
    DBMS_OUTPUT.PUT_LINE('b的值是:'||b);
    END;
    /


    二、CASE分支
    CASE
    WHEN...THEN...
    ELSE
    END CASE

    例:
    DECLARE
    a number;
    b varchar2(10);
    BEGIN
    a:=2;
    CASE
    WHEN a=1 THEN b:='a';
    WHEN a=2 THEN b:='b';
    ....
    ELSE
    b:='c';
    END CASE;
    DBMS_OUTPUT.PUT_LINE('b的值是:'||b);
    END;
    /

    4.环循语句的使用
    1.基本循环LOOP
    LOOP
    ...
    END LOOP
    例:
    DECLAE
    X NUMBER;
    BEGIN
    X:=0;
    LOOP
    X:=X+1;
    IF X>=3 THEN
    EXIT;
    END IF;
    DBMS_OUTPUT.PUT_LINE('体内X的值分别是:'||X);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('外X的值是:'||X);
    END;
    /

    2.WHILE循环
    WHILE expression LOOP
    ...
    END LOOP;
    例:
    DECLAE
    X NUMBER;
    BEGIN
    X:=0;
    LOOP
    X:=X+1;
    EXIT WHEN X>=3
    DBMS_OUTPUT.PUT_LINE('体内X的值分别是:'||X);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('外X的值是:'||X);
    END;
    /

    DECLAE
    X NUMBER;
    BEGIN
    X:=0;
    WHILE X<=3 LOOP
    X:=X+1;
    DBMS_OUTPUT.PUT_LINE('体内X的值分别是:'||X);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('外X的值是:'||X);
    END;
    /

    3.FOR循环
    FOR counter IN [REVERSE] start_value..end_value LOOP
    ...
    END LOOP;

    例:
    BEGIN
    FOR I IN 1..5 LOOP
    DBMS_OUTPUT.PUT_LINE('体内I的值分别是:'||I);
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('END');
    END;
    /

    FOR I IN REVERSE 1..5 LOOP  指的是倒着递增

    GOTO语句的使用
    DECLARE
    X NUMBER;
    BEGIN
    X:=0;
    <<REPEAT_LOOP>>   定义标记
    X:=X+1;
    DBMS_OUTPUT.PUT_LINE(X)
    IF X<3 THEN
    GOTO REPEAT_LOOP;   返回到标记处
    END IF;
    END;
    /

    5.异常处理的使用
    1.什么是异常
    在PL/SQL中的一个警告或错误的情形都被称为异常,包括编译时错误和运行时错误。
    3.异常分类
    系统异常,自定义异常
    4.异常结构
    EXCEPTION
    WHEN...THEN
    ...
    常见系统异常:
    DUP_VAL_ON_INDEX:向有唯一约束的表中插入重复行
    NO_DATA_FOUND:在一个SELECT INTO语句中无返回值 
    TOO_MANY_ROWS:SELECT INTO 语句返回了多行
    VALUES_ERROR:一个算法,转换,截断或大小约束发生错误
    ZERO_DIVIDE:发生被零除
    ......

    例:
    DECLARE
    test varchar2(10);
    BEGIN
    SELECT name INTO test FROM deptment WHERE id='tt';
    DBMS_OUTPUT.PUT_LINE(test);
    END;
    /
    这是就会出现一个错误no data found

    我们来设置一个异常补获:
    DECLARE
    test varchar2(10);
    BEGIN
    SELECT name INTO test FROM deptment WHERE id='tt';
    DBMS_OUTPUT.PUT_LINE(test);
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('没有找到数据');
    END;
    /

    自定义异常:
    DECLARE
    tname varchar2(10);
    e exception;  定义常规异常
    BEGIN
    SELECT name INTO tname FROM deptment WHERE id='01;
    IF tname<>'B部门' THEN
    RAISE e;        异常
    END IF;
    DBMS_OUTPUT.PUT_LINE(tname);
    EXCEPTION  异常处理部分
    WHEN e THEN
    DBMS_OUTPUT.PUT_LINE('ERROR,不是要的B部门');
    END;
    /

    6.记录的使用
    什么是记录:记录是由几个相关值构成的复合变量,常用于支持SELECT语句的返回值,使用记录可以将一行数据看成一个单元进行处理,而不必将每一列单独处理
    记录的声明
    TYPE type_name IS RECORD(
    Variable_name datatype[,
    Variable_name datatype[,
    ....
    );
    Real_name type_name;

    例:
    DECLARE
    TYPE myrecord IS RECORD(
    id varchar2(10),
    name varchar2(10);
    );
    real_record myrecord;
    BEGIN
    SELECT e_id,e_name INTO real_record FROM emp WHERE e_id='001';
    DBMS_OUTPUT.PUT_LINE(real_record.id||','||real_record.name);
    END;
    /

    Oracle学习笔记--复合数据类型
    By  洛基 发表于 2007-4-6 14:54:00  

    1、PL/SQL记录
       适用于处理单行多列数据
       eg:
       type emp_record_type is record(
            name     emp.ename%type,
            salary   emp.salary%type,
            dno      emp.detno%type   
       );
       emp_record emp_record_type;
      
    2、PL/SQL集合
       适用于处理单列多行的数据
      
       2.1  索引表
            eg1:
               type ename_table_type is table of emp.ename%type
               index by binary_integer; --(还可以是pls_integer)
               ename_table ename_table_type;       
               以下是两种放法:
                     .................
               forall i in ename_table.first..ename_table.last
                 /* sql语句*/
                     ................... 
           
               for i in 1..ename_table.count loop
               /* sql语句 */
               end loop
                       .............. 
                   
            eg2:
               type ename_table_type is table of number
               index by varchar(20);
               ename_table ename_table_type;
                   ................
              
               ename_table('上海')=1;
               ename_table('北京')=2;
                    ..............
          
            eg3:
            ename_table.delete;   --清空索引表的数据
           
      
       2.2  嵌套表
            下标从1开始,元素个数没有限制。
            eg:
               Type ename_table_type is table of emp.ename%type;
               ename_table  ename_table_type:=ename_table_type('A','A');  --必须要先初始化
                     ......
                 dbms_output.put_line(ename_table(2));
                     ......
                       
       2.3  变长数组
            下标从1开始,元素的最大个数是有限制的
            eg:
               Type ename_table_type is varray(20) of emp.ename%type;
               ename_table ename_table_type:=ename_table_type('A','A');   --必须要先初始化
      
      
    3、PL/SQL 记录表
            适用于多行多列数据
            eg:
              Type ename_table_type is table of emp%rowtype;
              index by binary_integer;
              ename_table ename_table_type;
              ------
              select * bulk collect into ename_table from emp;
              ------
             
      
    4、多级集合
       用法都差不多
       4.1多级VARRAY
       4.2多级嵌套表
       4.3多级索引表         
     
     

  • 相关阅读:
    浅析 MySQL Replication(转)
    mysql优化案例
    create index 与 alter table add index 区别
    /etc/sysctl.conf参数解释(转)
    Linux内核 TCP/IP参数调优
    OneProxy常用参数说明
    转载:如何在面试中写出好的代码
    F面经:painting house
    Lintcode: Merge Sorted Array II
    Lintcode: Median
  • 原文地址:https://www.cnblogs.com/astar/p/1122129.html
Copyright © 2020-2023  润新知