Oracle总结【PLSQL学习】 (二)

简介: 笔记

值得注意的是:eslif并没有写错的,它是少了一个e的

使用if-else-end if显示今天星期几,是"工作日"还是"休息日"
declare
    pday varchar2(10);
begin
    select to_char(sysdate,'day') into pday from dual;
    dbms_output.put_line('今天是'||pday);
    if pday in ('星期六','星期日') then
    dbms_output.put_line('休息日');
    else
    dbms_output.put_line('工作日');
    end if;
end;
/
从键盘接收值,使用if-elsif-else-end if显示"age<16","age<30","age<60","age<80"
declare
    age number(3) := &age;
begin
    if age < 16 then
       dbms_output.put_line('你未成人');
    elsif age < 30 then
       dbms_output.put_line('你青年人');
    elsif age < 60 then
       dbms_output.put_line('你奋斗人');
    elsif age < 80 then 
       dbms_output.put_line('你享受人');
    else
       dbms_output.put_line('未完再继');
    end if;
end;
/


循环

在PLSQL中,循环的语法有三种:

WHILE循环:

  • while后面跟的是循环条件,与java的差不多,LOOP和END LOOP是关键字**
WHILE  total  <= 25000  
LOOP
    total : = total + salary;
END  LOOP;

LOOP循环:

  • exit后面的条件成立了才退出循环【有点绕】
Loop
   exit [when 条件成立];
   total:=total+salary;
end loop;

FOR循环:

  • 循环的递增只能是1,不能自定义步长
FOR   I   IN   1 . . 3  
LOOP
语句序列 ;
END    LOOP ;
使用loop循环显示1-10
declare
    i number(2) := 1;
begin
    loop
        --当i>10时,退出循环
        exit when i>10;
        --输出i的值
        dbms_output.put_line(i);
        --变量自加
        i := i + 1;  
    end loop;
end;
/
使用while循环显示1-10
declare
    i number(2) := 1;
begin
    while i<11 
    loop
        dbms_output.put_line(i);
        i := i + 1;
    end loop;
end;
/
使用while循环,向emp表中插入999条记录
declare
    i number(4) := 1;
begin 
    while( i < 1000 )
    loop
        insert into emp(empno,ename) values(i,'哈哈');
        i := i + 1;
    end loop;   
end;
/
使用while循环,从emp表中删除999条记录
declare
    i number(4) := 1;
begin 
    while i<1000
    loop
        delete from emp where empno = i;
        i := i + 1;
    end loop;
end;
/
使用for循环显示20-30
declare
    i number(2) := 20;
begin
    for i in 20 .. 30
    loop
        dbms_output.put_line(i);
    end loop;
end;
/


游标

Oracle中的游标其实就是类似JDBC中的resultSet,就是一个指针的概念

既然是类似与resultSet,那么游标仅仅是在查询的时候有效的


语法

CURSOR  光标名  [ (参数名  数据类型[,参数名 数据类型]...)]
      IS  SELECT   语句;
使用无参光标cursor,查询所有员工的姓名和工资【如果需要遍历多条记录时,使用光标cursor,无记录找到使用cemp%notfound】
declare
    --定义游标
    cursor cemp is select ename,sal from emp;
    --定义变量
    vename emp.ename%type;
    vsal   emp.sal%type;
begin
    --打开游标,这时游标位于第一条记录之前
    open cemp;
    --循环
    loop
       --向下移动游标一次
       fetch cemp into vename,vsal; 
       --退出循环,当游标下移一次后,找不到记录时,则退出循环
       exit when cemp%notfound;
       --输出结果
       dbms_output.put_line(vename||'--------'||vsal);
    end loop;
    --关闭游标
    close cemp;
end;
/
使用带参光标cursor,查询10号部门的员工姓名和工资
declare
    cursor cemp(pdeptno emp.deptno%type) is select ename,sal from emp where deptno=pdeptno;
    pename emp.ename%type;
    psal emp.sal%type; 
begin 
    open cemp(&deptno);
    loop
        fetch cemp into pename,psal;     
        exit when cemp%notfound;
        dbms_output.put_line(pename||'的薪水是'||psal);
    end loop;
    close cemp;
end;
/
使用无参光标cursor,真正给员工涨工资,ANALYST涨1000,MANAGER涨800,其它涨400,要求显示编号,姓名,职位,薪水
declare
    cursor cemp is select empno,ename,job,sal from emp;
    pempno emp.empno%type;
    pename emp.ename%type;
    pjob   emp.job%type;
    psal   emp.sal%type;
begin
    open cemp;
    loop
        fetch cemp into pempno,pename,pjob,psal;
        --循环退出条件一定要写
        exit when cemp%notfound;
        if pjob='ANALYST' then
            update emp set sal = sal + 1000 where empno = pempno;
        elsif pjob='MANAGER' then
            update emp set sal = sal + 800 where empno = pempno;
        else 
        update emp set sal = sal + 400 where empno = pempno;
        end if;
    end loop;
    commit;
    close cemp;
end;
/


例外、异常

我们在上面看PLSQL中的语法已经知道,有一个exception,这个在Oracle中称为例外,我们也可以简单看成就是Java中的异常。。。


语法:

在declare节中定义例外   
out_of   exception ;
 在begin节中可行语句中抛出例外  
raise out_of ;
 在exception节处理例外
when out_of then …

23.jpg

使用oracle系统内置例外,演示除0例外【zero_divide】
declare
    myresult number;
begin
    myresult := 1/0;
    dbms_output.put_line(myresult);
exception
    when zero_divide then 
     dbms_output.put_line('除数不能为0');
     delete from emp;  
end;
/
使用oracle系统内置例外,查询100号部门的员工姓名,演示没有找到数据【no_data_found】
declare
    pename varchar2(20);
begin
    select ename into pename from emp where deptno = 100;
    dbms_output.put_line(pename);
exception
    when NO_DATA_FOUND then 
     dbms_output.put_line('查无该部门员工');
     insert into emp(empno,ename) values(1111,'ERROR');
end;
/

存储过程和存储函数

在Oracle中,存储过程和存储函数的概念其实是差不多的,一般地,我们都可以混合使用。只不过有的时候有的情况使用过程好一些,有的情况时候函数的时候好一些。下面会讲解在什么时机使用过程还是函数的。

首先,我们在学习存储过程和存储函数之前,先要明白我们为什么要学他….

其实存储过程和函数就是类似与我们在Java中的函数的概念….

到目前为止,我们的PLSQL是有几个缺点的:

  • PLSQL不能将其封装起来,每次调用的时候都要将整片代码复制来调用
  • 有的时候,我们想要将PLSQL的代码保存起来,只能自己手动保存在硬盘中,非常麻烦
  • 我们学数据库就是为了让程序能够调用的,但是PLSQL不能让程序(java)调用

因此,存储过程和存储函数就能解决上面的问题了,能够将代码封装起来,保存在数据库之中,让编程语言进行调用….


24.jpg

目录
相关文章
|
1月前
|
Oracle 关系型数据库 网络安全
Oracle 19c 安装教程学习
Oracle 19c 安装教程学习
61 2
|
6月前
|
存储 Java 数据库
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(二)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
76 0
|
11月前
|
SQL Oracle 关系型数据库
oracle学习
oracle学习
64 0
|
6月前
|
Oracle 网络协议 关系型数据库
异地使用PLSQL远程连接访问Oracle数据库【内网穿透】
异地使用PLSQL远程连接访问Oracle数据库【内网穿透】
|
SQL Oracle 关系型数据库
Oracle21C + PLSQL Developer 15 + Oracle客户端21安装配置完整图文版
Oracle21C + PLSQL Developer 15 + Oracle客户端21安装配置完整图文版
532 0
|
6月前
|
Oracle 关系型数据库 数据库
Oracle 11gR2学习之三(创建用户及表空间、修改字符集和Oracle开机启动)
Oracle 11gR2学习之三(创建用户及表空间、修改字符集和Oracle开机启动)
|
6月前
|
存储 Oracle 网络协议
Oracle 11gR2学习之二(创建数据库及OEM管理篇)
Oracle 11gR2学习之二(创建数据库及OEM管理篇)
|
6月前
|
Oracle 关系型数据库 数据库
Oracle 11gR2学习之一(安装篇)
Oracle 11gR2学习之一(安装篇)
|
6月前
|
Oracle 关系型数据库 Java
plsql链接远程Oracle数据库步骤
实际工作中,我们往往需要使用 PLSQL Develope 工具连接远程服务器上的 ORACLE 数据库进行管理,但是由于 ORACLE 安装在本地电脑步骤繁琐,并且会耗费电脑的很大一部分资源,因此,我们寻求一种不需要在本地安装 ORACLE 数据库而能直接使用 PLSQL Develope 工具连接到远程服务器 ORACLE 的方法。
110 2
|
6月前
|
存储 SQL Java
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(一)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
68 0