zoukankan      html  css  js  c++  java
  • 第四天、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多级索引表         
     
     

  • 相关阅读:
    Count and Say leetcode
    Find Minimum in Rotated Sorted Array II leetcode
    Find Minimum in Rotated Sorted Array leetcode
    Search in Rotated Sorted Array II leetcode
    search in rotated sorted array leetcode
    Substring with Concatenation of All Words
    Subsets 子集系列问题 leetcode
    Sudoku Solver Backtracking
    Valid Sudoku leetcode
    《如何求解问题》-现代启发式方法
  • 原文地址:https://www.cnblogs.com/astar/p/1122129.html
Copyright © 2011-2022 走看看