`

Oracle学习笔记 4 PL/SQL

阅读更多

PL/SQL 块是构成 PL/SQL 程序的基本单元
将逻辑上相关的声明和语句组合在一起
PL/SQL 分为三个部分,声明部分、可执行部分和异常处理部分
[DECLARE
    declarations]
    BEGIN
         executable statements
    [EXCEPTION
         handlers]
    END;
以下示例演示了如何使用PL/SQL 语句:
declare
   area integer;
   width integer;
   height integer;
   currentdate date;
   cnumber constant integer := 10;
begin
   area :=10;
   height :=2;
   width := area/height;
   currentdate :=sysdate;
   DBMS_OUTPUT.put_line('宽 = '||width);
   DBMS_OUTPUT.put_line('高 ='||height);
   DBMS_OUTPUT.put_line('面积 ='||area);
   DBMS_OUTPUT.put_line('常量的值为:'||cnumber);
   DBMS_OUTPUT.put_line('当前时间为:'||currentdate);
   exception
    when zero_divide then
      DBMS_OUTPUT.put_line('除数不能为零');
end;
给变量赋值有两种形式:
   使用赋值语句 :=
使用 SELECT INTO 语句
使用常量赋值:
    cnumber constant integer := 10;


以下代码演示了使用常量和SELECT INTO 语句:

declare
  firstName varchar2(20);
  lastName varchar2(20);
  employeeid number;
  consNumber constant integer  :=1000;
begin
   select employee_id, first_name,last_name into employeeid, firstName,lastname from employees2 where employee_id =1;
   DBMS_OUTPUT.put_line('consNumber = '||consNumber);
   DBMS_OUTPUT.put_line('employeeid='||firstName);
   DBMS_OUTPUT.put_line('firstName='||firstName);
   DBMS_OUTPUT.put_line('lastName='||lastname);
end;
CLOB数据类型的使用。
create table my_book_text(
chapter_id number(3),
chapter_descr varchar2(40),
chapter_text clob);
添加数据到clob字段 chapter_text :
insert into my_book_text values(5,'第五章 PL/SQL 简介','PL/SQL 可用于创建存储过程,触发器和程序包等,用来处理业务规则,数据库时间或给SQL命令的执行添加程序逻辑。');
读取 CLOB 数据类型:
set serveroutput on
declare
   clob_var clob;
   amount integer;
   offset integer;
   output_var varchar2(100);
begin
  select chapter_content into clob_var from my_book_text where chapterid=1;
   amount :=20;
   offset :=5;
  DBMS_LOB.READ(clob_var,amount,offset,output_var);
  DBMS_OUTPUT.put_line(output_var);
end;
/






PL/SQL 支持的流程控制结构:
条件控制
IF 语句
CASE 语句
循环控制
LOOP 循环
WHILE 循环
FOR 循环
顺序控制
GOTO 语句
NULL 语句
以下代码演示了条件控制(IF-THEN-ELSE语句):
declare
   age number(8);
begin
    age := &age;
   if age>20 and age<30 then
     dbms_output.put_line('年龄在20 和30 之间 ');
   elsif age < 20 then
     dbms_output.put_line('年龄小于20');
   else
     dbms_output.put_line('年龄大于30');
   end if;
end;
/
以下代码演示了从 employees2 表中检索employee_id 为 3 的记录 ,如果 salary 大于 15000 则减去 1000 ,否则salary 加 100
declare
    firstName varchar(20);
    lastName varchar2(20);
    salarytemp number(10);
begin
    select first_name,last_name,salary into firstName,lastName,salarytemp from employees2 where employee_id=3;
if salarytemp > 15000 then
   update employees2 set salary = salary-1000 where employee_id = 3;
else
     update employees2 set salary = salary+100 where employee_id=3;
end if;
   dbms_output.put_line('firstName ='||firstName);
   dbms_output.put_line('lastName='||lastName);
   dbms_output.put_line('salarytemp = '||salarytemp);
end;


Case 语句:
    以下代码演示了选择器。系统先计算选择器值。然后再依次选择 WHEN 子句。
set serveroutput on
begin
case '&grade'
  when 'A' then dbms_output.put_line('优异');
  when 'B' then dbms_output.put_line('优秀');
  when 'C' then dbms_output.put_line('良好');
  when 'D' then dbms_output.put_line('一般');
  when 'E' then dbms_output.put_line('较差');
      else dbms_output.put_line('没有此成绩');
end case;
end;
/
Loop 循环:以下代码演示了loop的使用
declare
   x number;
begin
   x :=0;
loop
    x:=x+1;
   if x>=3 then
   exit;
  end if;
  dbms_output.put_line('循环体 x ='||x);
end loop;
  dbms_output.put_line('循环体外 x ='||x);
end;
/
另外一种表现形式:
declare
   x number;
begin
  x :=0;
loop
    x:=x+1;
   exit when x>=3;
        dbms_output.put_line('循环体内 x ='||x);
end loop;
    dbms_output.put_line('循环体外 x ='||x);
    end;
While循环:
declare
   x number ;
begin
x:=0;
   while x<=3 loop
    x:=x+1;
   dbms_output.put_line('循环内'||x);
  end loop;
dbms_output.put_line('循环外'||x);
end;
/

以下代码演示了while 循环得使用。声明了销量的 monthly_value 和 daily_value,并将其初始化为0。While执行循环,直至每月销量的值大于等于4000
set serveroutput on
declare
   monthly_value number :=0;
   daily_value number :=0;
  begin
    while monthly_value <= 4000
    loop
      monthly_value := daily_value * 31;
      daily_value := daily_value +10;
      dbms_output.put_line('每日销量:' || daily_value);
    end loop;
  dbms_output.put_line('每月销量' || monthly_value);
end;
/
For循环语句:
begin
  for i in 1..5 loop
    dbms_output.put_line('循环 I 的值 = '||i);
end loop;
dbms_output.put_line('end loop');
end;
/
Reverse(递减) 的使用
begin
  for i in reverse 1..5 loop
    dbms_output.put_line('循环 I 的值 = '||i);
end loop;
dbms_output.put_line('end loop');
end;
/
以下代码显示了25个偶数
set serveroutput on
begin
  for eve_number in 1..25
   loop
     dbms_output.put_line(eve_number*2);
   end loop;
end;
/
Oracle 中异常的处理:
预定义异常:
返回多行异常:
declare
   firstname varchar2(20);
begin
    select first_name into firstname from employees2 where division_id ='SAL';
    dbms_output.put_line('first_name=' || firstname);
    exception
    when too_many_rows then
      dbms_output.put_line('不能返回多行数据');
end;
/
用户自定义异常:
以下代码演示了用户接受输入的类别。IF 语句将用户输入的类别与指定的类别相匹配。如果指定的类别中不存在将引发typeException 异常
     declare
typeException exception;
temptype varchar2(20);
begin
temptype :='&type';
if temptype not in ('java','c++','c#') then
  raise typeException;
else
  dbms_output.put_line('temptype = '||temptype);
end if;
exception
when typeException then
--dbms_output.put_line('没有找到相应的类型');
raise_application_error(-20000,'没有找到相应的类型');
end;
存储过程的使用:
过程是执行某些操作的子程序,它是执行特定任务的模块,它可以被赋予参数,存储在数据库中。以下代码
1. 创建存储过程语法:
CREATE [OR REPLACE] PROCEDURE
   <procedure name> [(<parameter list>)]
IS|AS
   <local variable declaration>
BEGIN
   <executable statements>
[EXCEPTION
   <exception handlers>]
END;
以下代码演示了如何创建一个不带参数的存储过程:
    create or replace procedure pro_emp
    as
       firstName varchar2(20);
       lastName varchar2(20);
       salary number(20);
    begin
select first_name,last_name,salary into firstName,lastName,salary from employees2 where employee_id = 1;
      dbms_output.put_line('firstName = '||firstName);
      dbms_output.put_line('lastName = ' ||lastName);
      dbms_output.put_line('salary = ' ||salary);
   exception
     when no_data_found then
      dbms_output.put_line('数据没有找到');
  end;
执行以上存储过程:
   execute  pro_emp ;

过程参数模式:参数传递的模式有三种IN , OUT , IN OUT
IN      是参数的默认模式,这种模式定义的参数在程序运行的时候已经具有值,在过程序体中这个值不会改变。
OUT    模式定义的参数只在过程内部赋值。
IN OUT  模式定义的参数当过程运行时可能已经具有值,但是在过程体中也可以修改







以下创建了带参数的过程:
    create or replace procedure mypro(employeeid in number,divisionid in out va
rchar2,jobid out varchar2)
    as
       tempdivid varchar2(20);
       tempjobid varchar2(20);
    begin
      select division_id,job_id into tempdivid,tempjobid from employees2 where
employee_id =employeeid;
       divisionid :=tempdivid;
       jobid :=tempjobid;
  end;

执行以上过程:
declare
   cdivisionid varchar2(20);
   cjobid varchar2(20);
   cempid number(10);
begin
   cempid :=1;
   mypro(cempid,cdivisionid,cjobid);
   dbms_output.put_line('...... cdivisionid = '||cdivisionid);
   dbms_output.put_line('...... cjobid = '||cjobid);
end;
/
Oracle中的函数:
以下代码创建了函数:
create or replace function myfun(empid number)
    return varchar2 is
      firstName varchar2(20);
      lastName varchar2(20);
    begin
      select first_name,last_name into firstName,lastName from employees2 where
employee_id = empid;
      return 'firstName = '||firstName ||'   lastName = '||lastName;
    end;
  /
执行以上函数:
declare
    fid number(8);
    info varchar2(100);
begin
   fid :=1;
   info :=myfunction(1);
   dbms_output.put_line('info ='||info);
end;
/

数据类型说明:
BINARY_INTEGER
  用户存储带符号的整数,, BINARY_INTEGER值的大小范围介于:-2的31次方减1到2的31次方减1之间,PL/SQL预定义了一下BINARY_INTEGER
子类型:
1. NATURAL: 可以限制变量存储非负整数值,即自然数。
2. NATURALN: 可以限制变量存储然数,且非空。
3. POSITIVE: 可以限制变量存储正整数。
4. POSITIVEN: 可以限制变量存储正整数,且非空。
5. SIGNTYPE: 可以限制变量存储-1,0和1 三个值。

分享到:
评论

相关推荐

    pl/sql数据库学习笔记

    pl/sql数据库学习笔记,包含一些基础知识,和案例代码

    Oracle 入门文档

    Oracle笔记 六、PL/SQL简单语句块、变量定义 Oracle笔记 七、PL/SQL 异常处理 Oracle笔记 八、PL/SQL跳转/判断/循环语句块 Oracle笔记 九、PL/SQL 游标的使用 Oracle笔记 十、PL/SQL存储过程 Oracle笔记 十一、...

    PL/SQL学习笔记

    PL/SQL有三种集合 联合数组 嵌套表 可变数组 联合数组详解: 什么是数组?数组有什么特点 数据是线性存放的,在内存中地址是连续的 可以用索引来访问 定义联合数组? 联合数组不需要定义长度,他能容纳的元素最大...

    oraclePL/SQL精华笔记

    此文档由个人总结快速学习pl/sql的案例及说明,也是快速查询pl、sql开发的精华文档,在此提供给大家学习与查阅

    Oracle笔记,主要是关于SQL以及PL/SQL部分

    最近学习Oracle时写的笔记,对于Oracle中常用的数据库对象、函数,常用语句,PL/SQL都有涉及到,学习的时候是看的动力节点的视频,其中部分知识点摘自网络

    sql,PL/SQl学习笔记

    Oracle的学习笔记,很有用的啊!里面有sqlplus,PL/SQL.对编程的朋友很有用

    我的PL/SQL学习笔记(一)

    关于一些PL/SQL的基础知识,有些代码用到了scott用户下的默认表emp和dept;

    pl/sql学习笔记

    这是oracle学习的进阶部分,笔记很详细,相信对大家会有帮助的!

    oracle PL-SQL 学习笔记2

    oracle PL-SQL 学习笔记 oracle PL-SQL 学习笔记

    oracle学习笔记整理

    学习oracle知识笔记整理,包括pl/sql编程,过程、函数、游标开发等。

    Oracle 学习笔记

    Oracle学习笔记 脚本运行环境PL/SQL Developer ·数据库的备份与恢复 ·存储过程精简实例

    oracle 学习笔记

    oracle 学习笔记 SQL 高级SQL PL/SQL的学习笔记

    Oracle PL/SQL高级编程

    主要是Oracle过程,函数,触发器,游标,包学习中自己所做的一些笔记,希望能够让初学者做一些参考!

    成功之路:Oracle11g学习笔记.pdf

    在介绍Oracle系统管理的知识以后,将介绍与开发相关的内容(如PL/SQL基础知识、存储过程、函数、包等),并介绍数据库性能调整,《成功之路:Oracle 11g学习笔记》重点介绍SQL语句调优。SQL语句调优是《成功之路:Oracle...

    oracle PL-SQL 学习笔记1

    oracle PL-SQL 学习笔记 很好的总结

    oracle学习笔记

    超完整的oracle学习笔记! 包括3部分:1、sql语句2、pl/sql编程3、其他信息等

    韩顺平oracle学习笔记

    韩顺平oracle学习笔记 第0讲:如何学习oracle 一、如何学习oracle Oracle目前最流行的数据库之一,功能强大,性能卓越。学习oracle需要具备一定基础: 1.学习过一门编程语言(如:java ,c) 2.最好学习过一门别的...

    linux oracle从零开始 学习笔记

    Linux简介 Linux命令 Linux远程连接工具 Oracle在linux下的安装 Oracle相关配置 Oracle常用命令 PL/SQL连接oracle 问题总结

    成功之路 Oracle 11g 中文学习笔记

    成功之路 Oracle 11g 中文学习笔记 专为开发人员编写,先引导开发新手熟悉Oracle环境,然后进入数据库开发,并要掌握项目开发的一些技巧。开发技巧展示是本书一大特色(这一点很值得资深的开发人员借鉴)! 本书共24...

Global site tag (gtag.js) - Google Analytics