`

Oracle数据库之PLSQL基础

阅读更多
--===================================PLSQL基础篇============================
-- 数据类型:
----  标量类型:数字 number,字符 varchar,varchar2,char,日期 ,
--             布尔 boolean (true,false,null)(存储单个值)
---  复合类型:record,集合类型 (存放多个值的变量)
---  参照类型:cursor
---  LOB 类型:存储大数据类型(BFILE,BLOB,CLOB,NCLOB);
--============ ===================================
---  EMP , DEPT 表;
--===============================================
--变量声明

declare
    v_realName  varchar2(20);
    -- := 赋值符号
    v_baseCost  number(7,2) :=5.9; --定义number类型,赋值5.9
    v_count binary_integer :=0;
    v_start boolean not null default false;
begin
    select 'hello ' into v_realname from dual; -- 给 v_realName变量赋值
    dbms_output.put_line('v_realName--'||v_realName);
    dbms_output.put_line('v_baseCost---'||v_baseCost);
    dbms_output.put_line('v_count---'||v_count);
end;
-- 执行 用  " / " ,下述同样操作

 
    --dbms_output.put_line('v_start---'||v_start); -- boolean类型的不能输出,不能插入,不能将列值保存到boolean变量中
    -- 只能对boolean变量执行逻辑操作(见后逻辑语句)

-- %type: 变量具有数据库的表中某列或其它变量相同的类型

declare
    v_name emp.ename%type;
 begin
  select ename into v_name from emp where empno = 7900;
  dbms_output.put_line('v_name---'||v_name);
end;

 

-- Record类型:处理单行多列问题
-- record变量的引用:记录类型变量的属性引用方法 " . "

declare
--t_emp_rec是记录类型
    type t_emp_rec is record   (
            name  emp.ename%TYPE,   -- name 是t_emp_rec的成员.
            job emp.job%TYPE);
 emp_rec     t_emp_rec; -- 声明--t_emp_rec记录类型的变量
begin
    select ename , job  into emp_rec from emp where empno = 7900; -- 读取数据到record类型
    -- select ename , job , sal   into emp_rec from emp where empno = 7900; -- error,没有足够的列值
    dbms_output.put_line('emp_rec-name---'||emp_rec.name);
    dbms_output.put_line('emp_rec-job---'||emp_rec.job);
end ;

 
 

-- 用%rowtype来定义record类型(作用:简化record的定义).
--  当使用%rowtype定义记录类型时,record成员的名称和类型与表或者视图的列名称和类型完全相同.

declare
        v_emp emp%rowtype ; -- v_cost的名称和类型和 cost表一样
 begin
    select *   into v_emp from emp where empno = 7900; -- 读取数据到record类型
    dbms_output.put_line('v_emp-name---'||v_emp.ename);
end ;

 

--================================================================
--=========流程控制:=============


 /*
if 布尔表达式
        then xxxx
    elsif 布尔表达式
        then      xxxx
    else        xxxx
end if;
*/

declare
 v_var boolean not null default false;
v_int integer :=5;   
 begin
    if v_var
        then  dbms_output.put_line('v_var: true');
    else
          dbms_output.put_line('v_var: false');
           -- then dbms_output.put_line('v_var: false'); error
    end  if; --必须结束if
    -- 多个if嵌套
    if(v_int > 5)
        then  dbms_output.put_line('v_int: >5');
    elsif (v_int > 2)
        then  dbms_output.put_line('v_int: >2');
    else
         dbms_output.put_line('v_int: else');
end if;
end ;

 
/*
loop循环:
 loop
    语句 1 ;
    语句 2;
    exit when 表达式;
end loop;
*/

declare
    v_int integer :=3;
begin
    loop
      dbms_output.put_line('v_int:'||v_int);   
     v_int :=v_int+1;
     
     if(v_int > 10)
        then exit; --退出
     end if;
    --exit when v_int > 10; 可以出现在循环的任何位置,注意是when ,不是then;
    end loop;
end;

 

 

--where循环:
/*
while 布尔表达式 loop
    语句1;
    语句2;
end loop;
*/

declare
    v_int integer :=1;
begin
    while v_int < 10 loop
          dbms_output.put_line('v_int:'||v_int);   
            v_int :=v_int+1;
    end loop;
end;

 

/*
for循环:
for 循环计数器 in 下限 .. 上限 loop
    语句1;
    语句1;
end loop;
*/

declare
    v_int integer :=0;
begin
for v_int in 1 .. 10 loop
            -- 循环 包括1,包括10;
            dbms_output.put_line('v_int:'||v_int);   
            --v_int :=v_int+1; v_int不能用来作为赋值目标
end loop;
end;

 

-- for循环 倒序

declare
    v_int integer :=10;
begin
for v_int in reverse 1 .. 10 loop
            dbms_output.put_line('v_int:'||v_int);   
            --v_int :=v_int+1; v_int不能用来作为赋值目标
end loop;
end;

 

--Notice: v_int 是 1.. 10循环中的每个变量,不能用来作为赋值目标
--    把 v_int 初始化为5,输出的结果跟初始化为0是一样.类似如下的java程序:

int j = 5;
for (j = 1 ;j <= 10 ; j++){
    System.out.println(j); //  1 .... 10;
}

 

--NULL
    --NULL语句不会执行任何操作,并且会直接将控制传递到下一条语句,使用NULL语句主要是提高程序的可阅读性

DECLARE
    v_sal emp.sal%TYPE;
    v_ename emp.ename%TYPE;
BEGIN
      SELECT ename,sal into v_ename,v_sal FROM emp WHERE empno=7900;
       IF v_sal<3000 then
          UPDATE emp SET comm=sal*1.2 WHERE ename=v_ename;
        ELSE
           NULL;
         END IF;
END;

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics