oracle 学习笔记之PL/SQL程序设计

1.PL/SQL的定义:

PL/SQL(Procedure Language/SQL)

PLSQL是Oracle对sql语言的过程化扩展

指在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力。

把SQL语言的数据操纵能力与过程语言的数据处理能力结合起来,使得PLSQL面向过程但比过程语言简单、高效、灵活和实用。

Plsql(oracle),Transact-sql(SQL server)

2.入门程序-->打印hello world;

set serveroutput on;
--声明变量 如果没有可以不写
declare
-- 开始
begin
dbms_output.put_line('hello world!');
--结束 必须加上分号
end;
/

运行结果:

注意:如果要在屏幕上输出信息,需要将serveroutput开关打开:

3.声明变量

1)方式一:

set serveroutput on;
declare
  --声明一般的变量,可以指定初始值,注意要使用:=
  vname emp.ename%type;--和数据库中的变量的类型保持一致
  vsal number :=0;--声明为number类型
begin
  --把查询的结果赋值给变量
  select ename,sal into vname,vsal from emp where empno=7839;
  --显示结果
  dbms_output.put_line(vname||'的薪水是'||vsal);
end;
/

运行结果:

2)方式二

set serveroutput on;
accept empno prompt '请输入员工编号';
declare
  --声明记录变量
  rec_emp emp%rowtype;
begin
  --把查询出来的结果赋值给变量
  select *  into rec_emp from emp where empno=&empno;
  dbms_output.put_line(rec_emp.ename||'的薪水是'|| rec_emp.sal);
end;
/

运行结果:

4.if

set serveroutput on;
accept num prompt '请输入数字';
declare
    --定义变量
    vnum number;
    vstr varchar2(5);
begin
  vnum:= #
  if vnum>0 then vstr:='正数';
  elsif vnum<0 then vstr:='负数';
  else vstr:='零';
  end if;
  dbms_output.put_line(vstr);
end;
/

5.循环

1)循环方式一

set serveroutput on
begin
  for i in 1..10
  loop
    --循环体内容
    dbms_output.put_line(i);
  end loop;
end;
/

2)循环方式二(这种方式比较常用)

set serveroutput on;
declare
vnum number :=1;--初始化变量
begin
  loop
    --退出循环的条件
    exit when vnum>10;
    dbms_output.put_line(vnum);
    --加一
    vnum:=vnum+1;
  end loop;--结束循环
end;
/

3)循环方式三:

set serveroutput on;
declare
vnum number :=1;
begin
  --当条件成立,就执行循环体
  while vnum<10
  loop
    dbms_output.put_line(vnum);
    --加一
    vnum:=vnum+1;
  end loop;
end;
/

运行结果:

6.光标

set serveroutput on;
/*要求:显示总员工数和所有员工的姓名和工资
* select ename,sal from emp;
*/
declare
  --声明光标
  cursor c_emp is select ename,sal from emp;
  --定义变量
  vcount number;
  vname emp.ename%type;
  vsal number;
begin
  --查询并显示员工总数量
  select count(*) into vcount from emp;
  dbms_output.put_line('总的员工数为:'||vcount);
  --要使用光标就需要打开光标
  open c_emp;
  --循环
  loop
    --先取出一行记录
    fetch c_emp into vname,vsal;
    --指定退出循环的条件
    exit when c_emp%notfound;
    dbms_output.put_line(vname||'的工资是'||vsal);
  end loop;
    --关闭光标
  close c_emp;
end;
/

运行结果:

注:这里查询的结果和与cmd命令行查询的结果一致

7.光标应用案例:给员工涨工资

set serveroutput on
--要求 :按照员工的工种涨工资,总裁(PRESIDENT) 1000 ,经理(MANAGER)800 其他员工 400
--分析:取出所有员工,每一个员工就行判断,符合什么条件,就涨多少工资
--select empno,empjob from emp;
-- update emp set sal=sal+? where empno=?
declare
  --定义一个光标(所有员工的集合)
  cursor  c_emp is select empno,empjob from emp;
  --定义与光标有关的变量
  vempno emp.empno%type;
  vempjob emp.empjob%type;
begin
  open c_emp;
    loop
      --获取数据
      fetch c_emp into vempno,vempjob;
      exit when c_emp%notfound;--指定退出循环的条件
      --判断是什么情况 就涨多少工资
      if vempjob='PRESIDENT' then update emp set  sal=sal+1000 where empno=vempno;
      elsif vempjob='MANAGER' then update emp set  sal=sal+800 where empno=vempno;
      else update emp set  sal=sal+400 where empno=vempno;
      end if;--结束if判断
    end loop;
  close c_emp;
  commit; --提交事务
  dbms_output.put_line('执行完毕');
end;
/

运行结果:

8.带参数的光标

set serveroutput on;
--要求:显示10号部门中的总员工数,和每个员工的姓名和工资信息
declare
  --定义光标
  cursor c_emp(dno number) is select ename,sal from emp where deptno=dno;
  --定义与光标相关的变量
  vename emp.ename%type;
  vsal emp.sal%type;
  vdeptno emp.deptno%type;
  vcount number;
begin
  --获取查询条件
  vdeptno :=&input_deptno;
  --显示 部门中的总员工数
  select count(*) into vcount from emp where deptno=vdeptno;
  dbms_output.put_line('总的员工数为:'||vcount);
  --打开光标
  open c_emp(vdeptno);
    loop
      fetch c_emp into vename,vsal;
      exit when c_emp%notfound;
      dbms_output.put_line(vename||'的工资是'||vsal);
    end loop;
  close c_emp;--关闭光标
end;
/

运行结果:

9.异常

set serveroutput on
declare
  vnum number;
begin
  vnum:=1/0;
  --处理异常
  exception
    when zero_divide then dbms_output.put_line('异常:被0除');
end;
/

运行结果:

10.自定义异常

set serveroutput on;
--自定义异常
 declare
  --声明一个异常类型
  my_exception exception;
 begin
  --抛出异常
  raise my_exception;
  exception
    --异常处理
    when my_exception then dbms_output.put_line('自定义异常');
 end;
 /

运行结果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 00:17:17

oracle 学习笔记之PL/SQL程序设计的相关文章

Oracle学习(十一):PL/SQL

1.知识点:可以对照下面的录屏进行阅读 PL/SQL程序结构 declare 说明部分 (变量说明,光标申明,例外说明 ] begin 语句序列 (DML语句]- exception 例外处理语句 End; / ------------------------------------------------------------------ --第一个PL/SQL程序:HelloWorld set serveroutput on --如果要在屏幕上输出信息,需要将serveroutput开关打

ORACLE数据库笔记之PL/SQL

PL/SQL PL/SQL是一种块结构的语言,它是将一组语句放在一个块中,一次性发送给服务器.它是结合Oracle过程语言和结构化查询语言的一种扩展语言 PL/SQL代码块的构成 declare --标记声明部分用来声明一些变量,位于begin之前 begin  --主程序体开始的标志 主程序体块: [exception when 异常名 then 异常处理的方法; when 异常名  then 异常处理的方法; ... when other then 异常处理的方法;] end;  --主程序

Oracle 学习笔记 19 -- 触发器和包浅析(PL/SQL)

触发器是存放在数据库中的一种特殊类型的子程序.不能被用户直接调用,而是当特定事件或操作发生时由系统自己主动 调用执行.触发器不能接受參数.所以执行触发器就叫做触发或点火.Oracle事件指的是数据库的表进行的insert .update.delete操作或对视图进行类似的操作. 触发器是很多关系数据库系统都提供的一项技术.在Oracle系统里,触发器类似过程和函数,都有声明,运行和异常 处理过程的PL/SQL块. 触发器的组成: 触发事件:在何种情况下触发:比如:INSERT , UPDATE

Oracle 学习笔记 17 -- 异常处理(PL/SQL)

程序在执行过程中出现异常是正常的,在程序的编写过程中出现异常也是不可避免的.但是要有相应的异常处理的机 制,来保证程序的正常执行.PL/SQL程序执行过程中出现的错误,称为异常.一个优秀的程序都应该能够正确处理 各种出错的情况,并尽可能的从错误中恢复.PL/SQL提供了异常处理机制. 概念: 异常处理(exception)是用来处理正常执行过程中未预料的事件,程序块的异常处理定义的错误和自定义的错误, 由于PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会异常的终止. 有三种类型的错误

Oracle 学习笔记 18 -- 存储函数和存储过程(PL/SQL子程序)

PL/SQL子程序 包括函数和过程.这里的函数指的是用户自己定义的函数,和系统函数是不同的.子程序一般是完成特定功能的PL/SQL程序块,并且具有一定的通用性,可以被不同的应用程序多次调用.Oracle提供可以把PL/SQL程序存储在数据库中,并可以再任何地方来运行它.这样就叫做存储过程或者是函数.过程和函数的唯一区别就是函数总是向调用者返回数据,而过程则不返回数据. 函数 如果用户要经常执行某些操作,并且需要返回特定的数据,那么就可以将这些操作构造成一个函数. 可以使用SQL语句定义函数. 基

oracle pl/sql 程序设计 历史笔记整理

20131016 周三 oracle pl/sql 程序设计 第2章 创建并运行pl/sql代码 sqlplus yjkhecc/[email protected]:1521/orcl 在java中调用存储过程: create or replace procedure t_p(l_in in out number) is begin l_in := 5; end; @Test public void test() throws SQLException { DataSource ds = Dat

每周一书《Oracle 12 c PL(SQL)程序设计终极指南》

本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQL程序设计终极指南>志在打造PL/SQL领域最为系统.全面.实战.权威的著作,通过一系列非常突出的优势在大量的同类书中脱颖而出,成为该领域的标准读物. PL/SQL本身涉及的知识点浩瀚.庞杂,初学者根本无法依靠自身能力理清头绪,学习成本极高.本书对知识点进行了体系化的梳理,化繁杂为有序,突出重点,直指核

[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下) ——通过知识共享树立个人品牌. 继上六篇: [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程之四:把游标说透(

Oracle学习笔记三 SQL命令

SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)               下面是这四种SQL语言的详细笔记: Oracle学习笔记三 SQL命令(二):SQL操作语言类别 Oracle数据类型 创建表时,必须为各个列指定数据类型 以下是 Oracle 数据类型的类别: 字符数据类型 CHAR类型 当需要固定长度的字符串时,使用 CHAR 数据类型. CHAR 数据类型存储字母数字值. CH