zoukankan      html  css  js  c++  java
  • plsql学习笔记1

    declare
       
    /*申明区 声明变量 定义类型*/

    beginplsql的程序结构

       
    /*执行区 执行sql语句或者plsql语句*/

    exception
       
    /*异常处理区*/

    end;


    set severoutput on

    将输出结果显示在屏幕上

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

    变量的数据类型
    标准类型:
        number
        varchar2
        date
        boolean
        binary_integer
    组合类型
        record  table类型
    参考类型
        ref     cursor
    大类型:(一般存储的是资源的路径)
        BFILE   大二进制    0~4G
        blob    大字符类型  0~4G
        clob
    ----------------------------------------
    关于函数中变量的赋值,可以在声明时就初始化
    也可以先声明,等用到的时候再赋值
    赋值符号    := 可以赋值plsql中的任何类型
    declare
        num number;
        name varchar2(30);
    begin
        num:=1;
        name:='Judy';
        dbms_output.put_line('NO.'||num||'is'||name);
    end;

    声明变量时就赋值
    declare
        num number:=1;
        name varchar2(30):='Judy';
    begin
        dbms_output.put_line('NO.'||num||' is '||name);
    end;

    plsql中注释可以用
    /**/ 多行注释 和 --单行注释
    declare
        name varchar2(10):='Tom';
    begin
        dbms_output.put_line('My name is '||name);
        /*
            注释
        */
    end;

    declare
        name varchar2(10):='TOM';
    begin
        dbms_output.put_line('My name is '||name);
        --注释1
        --注释2
    end;

    constant 防止变量被修改
    constant 修饰的变量必须初始化
    declare
        num constant number:=1;
    begin
        num:=2;
    end;
    constant修饰的变量再次赋值时将会出现如下错误
    PLS-00363: expression 'NUM' cannot be used as an assignment target

    变量声明之后未初始化的值为空
    declare
        num number;
    begin
        dbms_output.put_line('num is '||num||'?');
    end;

    在函数中需要用到,已存在的表中数据类型时
    可以使用%type
    emp_id s_emp.id%type;
    s_emp数据库中已经存在的表名,id是所需要的表中的数据类型
    可以使用select从一张表中取值然后赋给变量
    declare
        emp_id s_emp.id%type;
        emp_name s_emp.first_name%type;
        emp_salary s_emp.salary%type;
    begin
        select id,first_name,salary into emp_id,
        emp_name,emp_salary from s_emp where id=1;
        dbms_output.put_line(emp_id||' '||emp_name||
        ' '||emp_salary);
    end;

    record 相当于C语言中的结构体
    type 记录名 is record(
        变量名  类型,
        变量名  类型
        ......
    );
    declare
        type emp is record(
            id number,
            name varchar2(30)
        );
        emp1 emp;
        emp2 emp;
    begin
        emp1.id:=1;
        emp1.name:='Tom';
        dbms_output.put_line(emp1.id||' '||emp1.name);
        emp2:=emp1;
        dbms_output.put_line(emp2.id||' '||emp2.name);
    end;

    同类型record在相互赋值时
    可以整体赋值
    也可以给几个需要的变量之间进行赋值

    当需要在一个record中记录一个表格中的所有类型时
    使用    表名%rowtype
    declare
        emp s_emp%rowtype;
    begin
        select * into emp from s_emp where id=1;
        dbms_output.put_line(emp.id||' '||
        emp.first_name||' '||emp.salary);
    end;
    注意:
        emp中的变量名和使用
        SQL>desc s_emp
        查看到的表头里面变量名是一致的(包括类型和顺序)
    ---------------------------------------------
    定义表类型
    type 表名 is table of 表中的数据类型
    index  by binary_integer;

    相当于C语言中的数组
    其中数据类型可以时基本类型 也可以时记录类型
    只有当向表中插入数据的时候才会分配内存

    下标 是整数的取值范围,可以不连续
    使用迭代思想
    first() 得到第一元素的下标
    next(n-1) 跟据上一个元素n-1的的下标得到下一个元素的下标
    last() 最后一个元素的下标

    基本类型表
    declare
        type numbertype is table of number
        index by binary_integer;
        nums numbertype;
        num_index number;
    begin
        nums(1):=100;
        nums(3):=300;
        nums(5):=700;
        /*改成循环
        num_index:=nums.first();
        dbms_output.put_line('nums(1)= '||nums(num_index));
        num_index:=nums.next(num_index);
        dbms_output.put_line('nums(3)= '||nums(num_index));
        num_index:=nums.next(num_index);
        dbms_output.put_line('nums(7)= '||nums(num_index));
        */
        num_index:=nums.first();
         loop
            dbms_output.put_line('nums('||num_index||')'||
            nums(num_index));
            exit when num_index=nums.last();
            num_index:=nums.next(num_index);
        end loop;
    end;

    record类型表
    declare
        type employee is table of s_emp%rowtype
        index by binary_integer;
        emp employee;
        emp_index binary_integer;
        num number:=1;
    begin
        while(num<=25) loop
        select * into emp(num) from s_emp where id=num;
        num:=num+1;
        end loop;
        emp_index:=emp.first();
        loop
            dbms_output.put_line(emp(emp_index).id||':'||
            emp(emp_index).first_name||':'||
            emp(emp_index).salary);
            exit when emp_index=emp.last();
            emp_index:=emp.next(emp_index);
        end loop;
    end;

    ---------------------------------------------
    plsql中的if语句
        if 条件 then
            /*符合条件执行代码*/
        else
            /*不符合条件执行的代码*/
        end if;
       
        if 条件1 then
            /*符合条件1执行的代码*/
        elsif 条件2 then
            /*符合条件2执行的代码*/
        ........
        elsif 条件n then
            /*符合条件n执行的代码*/
        else
            /*所有上述条件都不符合执行的代码*/
    ------------------------------------------------
    plsql中的循环
    1.最简单的循环
        loop
        /*执行代码*/
        exit when 退出条件
        /*执行代码*/
        end loop;
    2.while 循环
        while 退出条件 loop
            /*执行代码*/
        end loop;
    3.for 循环
        for i in 1..n loop
            /*执行代码*/
        end loop;
        注:i 不需要声明,系统会自动声明
        1..n的取值范围[1,n]

        如果循环需要从n到1执行
        for i in reverse 1..n loop
            /*执行代码*/
        end loop;
    4.嵌套循环
    begin
        for i in 1..n loop
            for j in 1..m loop
                /*执行代码*/
            end loop;
        end loop;
    end;
    注:
        在while和for循环中可以使用
        exit when 退出条件
        提前退出循环
    -----------------------------------------
    plsql中依旧和C语言中的变量规则一样,局部变量优先
    plsql解决这种问题的办法标签
    标签    <<标签名>>
    <<abc>>
    declare
        num number:=1;
    begin
        declare
            num number:=2;
        begin
            dbms_output.put_line('num='||num);
            dbms_output.put_line('abc.num='||abc.num);
        end;
    end;

  • 相关阅读:
    【DevExpress v17.2新功能预告】DevExtreme TreeList
    MyEclipse WebSphere开发教程:安装和更新WebSphere 6.1, JAX-WS, EJB 3.0(六)
    【DevExpress v17.2新功能预告】改进DevExtreme编辑器
    MyEclipse WebSphere开发教程:安装和更新WebSphere 6.1, JAX-WS, EJB 3.0(五)
    DevExpress DateEdit 5 常见问题解决方法
    CSS五种方式实现 Footer 置底
    css中雪碧图(sprite)的使用及制作方法
    CSS实现垂直居中的5种方法
    如何使用CSS创建巧妙的动画提示框
    css定位方式有哪几种?
  • 原文地址:https://www.cnblogs.com/spring-1991/p/3222056.html
Copyright © 2011-2022 走看看