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;

原文地址:https://www.cnblogs.com/spring-1991/p/3222056.html