PL/SQL学习笔记_01_基础

PL/SQL语句可以在Oracle客户端的 SQL窗口或者 command  窗口中运行

在SQL窗口中运行步骤同 SQL语句

在command  窗口中运行的步骤如下:

1)File—new command window,出现下图

2)输入命令:set serveroutput on    ,回车执行

作用:开启输出服务

3)输入命令:ed   ,回车执行

作用:打开PL/SQL文本编辑器,可以在此文本编辑器中写PL/SQL语句

4)输入命令:/   ,回车执行

作用:执行PL/SQL语句

1.PL/SQL语法格式

[语法格式]
--declare
              --声明的变量、记录类型、游标
begin
              --程序的执行部分(类似于java里的main()方法)
  dbms_output.put_line(‘helloworld‘);
--exception
              --针对begin块中出现的异常,提供处理的机制
  --when .... then ...
  --when  .... then ...
end;

              --其中begin,end 必不可少

2.变量命名规则

3.声明变量类型

3.1常规变量

char,varchar2,date,number,boolean,long

declare
  --声明变量
  v_name varchar2(25);
  v_email varchar2(25);
  v_salary number(8, 2);
  v_job_id varchar2(10);
begin
  --通过 select ... into ... 语句为变量赋值
  --被赋值的变量与SELECT中的列名要一一对应
 select last_name, email, salary, job_id into v_name, v_email, v_salary, v_job_id
 from employees
 where employee_id = 186;

 -- 打印变量的值
 dbms_output.put_line(v_name || ‘, ‘ || v_email || ‘, ‘ ||  v_salary || ‘, ‘ ||  v_job_id);
end;

3.2记录类型

记录类型类似于java 的类

语法格式:

TYPE record_type IS RECORD(
   Field1 type1 [NOT NULL] [:= exp1 ],
   Field2 type2 [NOT NULL] [:= exp2 ],
   . . . . . .
   Fieldn typen [NOT NULL] [:= expn ]
) ;

自定义记录类型示例:

declare
  --定义一个记录类型
  type emp_record is record(
    v_name varchar2(25),
    v_email varchar2(25),
    v_salary number(8, 2),
    v_job_id varchar2(10)  );

  --声明自定义记录类型的变量
  v_emp_record emp_record;
begin
  --通过 select ... into ... 语句为变量赋值
 select last_name, email, salary, job_id into v_emp_record
 from employees
 where employee_id = 186;

 -- 打印变量的值
 dbms_output.put_line(v_emp_record.v_name || ‘, ‘ || v_emp_record.v_email || ‘, ‘ ||  v_emp_record.v_salary || ‘, ‘ ||  v_emp_record.v_job_id);
end;

3.3 %type

使用 %type 定义变量,动态的获取数据的声明类型

定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同,这时可以使用%TYPE

declare
  --定义一个记录类型
  type emp_record is record(
    v_name employees.last_name%type,        --使v_name的类型与employees表中last_name类型保持一致
    v_email employees.email%type,
    v_salary employees.salary%type,
    v_job_id employees.job_id%type
  );

  --声明自定义记录类型的变量
  v_emp_record emp_record;
begin
  --通过 select ... into ... 语句为变量赋值
 select last_name, email, salary, job_id into v_emp_record
 from employees
 where employee_id = 186;

 -- 打印变量的值
 dbms_output.put_line(v_emp_record.v_name || ‘, ‘ || v_emp_record.v_email || ‘, ‘ ||
                                        v_emp_record.v_salary || ‘, ‘ ||  v_emp_record.v_job_id);
end;

3.4 %rowtype

PL/SQL 提供%ROWTYPE 操作符, 返回一个记录类型, 其数据类型和数据库表的数据结构相一致

declare
--声明一个记录类型的变量
  v_emp_record employees%rowtype;
begin
  --通过 select ... into ... 语句为变量赋值
 select * into v_emp_record
 from employees
 where employee_id = 186;

 -- 打印变量的值
 dbms_output.put_line(v_emp_record.last_name || ‘, ‘ || v_emp_record.email || ‘, ‘ ||
                                        v_emp_record.salary || ‘, ‘ ||  v_emp_record.job_id  || ‘, ‘ ||
                                        v_emp_record.hire_date);
end;

4. 变量赋值

4.1 :=

:=    赋值号   (赋值操作)

=    等于       (判断操作)

=>                 (用于参数赋值)

语法格式:

variable := expression ;
--variable 是一个 PL/SQL 变量, expression 是一个 PL/SQL 表达式.

4.2 数据库赋值

数据库赋值是通过 SELECT语句来完成的,每次执行 SELECT语句就赋值一次, 一般要求被赋值的变量与SELECT中的列名要一一对应。

如: 通过变量实现查询语句

declare
  v_emp_record employees%rowtype;
  v_employee_id employees.employee_id%type;
begin
  --使用赋值符号为变量进行赋值
  v_employee_id := 186;

  --通过 select ... into ... 语句为变量赋值
 select * into v_emp_record
 from employees
 where employee_id = v_employee_id;

 -- 打印变量的值
 dbms_output.put_line(v_emp_record.last_name || ‘, ‘ || v_emp_record.email || ‘, ‘ ||
                                        v_emp_record.salary || ‘, ‘ ||  v_emp_record.job_id  || ‘, ‘ ||
                                        v_emp_record.hire_date);
end;

5. 通过变量实现DELETE、INSERT、UPDATE等操作

declare
  v_emp_id employees.employee_id%type;

begin
  v_emp_id := 109;
  delete from employees
  where employee_id = v_emp_id;
  --commit;
end; 

6.流程控制之条件语句(2种)

6.1  IF 语句 ;

IF <布尔表达式>  THEN
    PL/SQL 和 SQL 语句;
ELSIF < 其它布尔表达式> THEN
    其它语句;
ELSIF < 其它布尔表达式> THEN
    其它语句;
ELSE
    其它语句;
END IF;

-- ELSIF 不能写成 ELSEIF

示例:

/*
要求: 查询出 150号 员工的工资, 若其工资大于或等于 10000 则打印 ‘salary >= 10000‘;
若在 5000 到 10000 之间, 则打印 ‘5000<= salary < 10000‘; 否则打印 ‘salary < 5000‘

*/
declare
     v_emp_name employees.last_name%type;
     v_emp_sal employees.salary%type;
     v_emp_sal_level varchar2(20);
begin
     select last_name,salary into v_emp_name,v_emp_sal from employees where employee_id = 150;

     if(v_emp_sal >= 10000)   then v_emp_sal_level := ‘salary >= 10000‘;
     elsif(v_emp_sal >= 5000) then v_emp_sal_level := ‘5000<= salary < 10000‘;
     else v_emp_sal_level := ‘salary < 5000‘;
     end if;

     dbms_output.put_line(v_emp_name||‘,‘||v_emp_sal||‘,‘||v_emp_sal);
end;

6.2  CASE 语句

语法格式:

CASE selector
WHEN expression1 THEN result1
WHEN expression2 THEN result2
WHEN expressionN THEN resultN
[ ELSE resultN+1]
END;

示例:

/*要求: 查询出 122 号员工的 JOB_ID, 若其值为 ‘IT_PROG‘, 则打印 ‘GRADE: A‘;
                        ‘AC_MGT‘, 打印 ‘GRADE B‘,
                        ‘AC_ACCOUNT‘, 打印 ‘GRADE C‘;
                        否则打印 ‘GRADE D‘
*/
declare
       --声明变量
       v_grade char(1);
       v_job_id employees.job_id%type;
begin
       select job_id into v_job_id
       from employees
       where employee_id = 122;

       dbms_output.put_line(‘job_id: ‘ || v_job_id);

       --根据 v_job_id 的取值, 利用 case 字句为 v_grade 赋值
       v_grade :=
               case v_job_id when ‘IT_PROG‘ then ‘A‘
                             when ‘AC_MGT‘ then ‘B‘
                             when ‘AC_ACCOUNT‘ then ‘C‘
                             else ‘D‘
                end;

       dbms_output.put_line(‘GRADE: ‘ || v_grade);
end; 

7.流程控制之循环语句(3种)

7.1  LOOP 循环

语法格式:

declare
    --初始化条件
    v_i number(3) := 1;
begin
    loop
         --循环体
         dbms_output.put_line(v_i);
         --循环条件
         exit when v_i = 100;
         --迭代条件
         v_i := v_i + 1;
    end loop;
end;

7.2 WHILE 循环

语法格式;

declare
       --初始化条件
       v_i number(3) := 1;
begin
       --循环条件
       while v_i <= 100 loop
             --循环体
             dbms_output.put_line(v_i);
             --迭代条件
             v_i := v_i + 1;
       end loop;
end; 

示例:

/*综合使用 if, while 语句, 打印 1 - 100 之间的所有素数
(素数: 有且仅用两个正约数的整数, 2, 3, 5, 7, 11, 13, ...).
*/
declare
  v_flag number(1):=1;
  v_i number(3):=2;
  v_j number(2):=2;
begin

  while (v_i<=100) loop
        while v_j <= sqrt(v_i) loop
              if (mod(v_i,v_j)=0) then v_flag:= 0;
          end if;

          v_j :=v_j +1;
        end loop;

    if(v_flag=1) then dbms_output.put_line(v_i);
    end if;

        v_flag :=1;
        v_j := 2;
        v_i :=v_i +1;
   end loop;

end;

7.3  FOR 循环

语法格式:

FOR 循环计数器  IN  [ REVERSE ]  下限 ..  上限  LOOP
     要执行的语句;
END  LOOP;

示例:

--使用for循环实现1-100之间的素数的输出
declare
  --标记值, 若为 1 则是素数, 否则不是
  v_flag number(1) := 0;
begin
   for i in 2 .. 100 loop

       v_flag := 1;     

       for j in 2 .. sqrt(i) loop
           if i mod j = 0 then
              v_flag := 0;
           end if;
       end loop;

       if v_flag = 1 then
           dbms_output.put_line(i);
       end if;

   end loop;
end;

8. 标号和 GOTO

PL/SQL 中 GOTO 语句是无条件跳转到指定的标号去的意思。语法如下:

GOTO label;
. . . . . .
<label>>       /*标号是用<< >>括起来的标识符 */

示例:

--打印1——100的自然数,当打印到50时,跳出循环,输出“打印结束”

begin
  for i in  1..100  loop
      dbms_output.put_line(i);
      if(i = 50) then
      goto label;
      end if;
  end loop;

      <<label>>
      dbms_output.put_line(‘打印结束‘);

end;
时间: 2025-01-04 10:00:51

PL/SQL学习笔记_01_基础的相关文章

Oracle之PL/SQL学习笔记

自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家批评指正. PL/SQL定义:PL/SQL是由Oracle开发,专门用于Oracle的程序设计语言. PL---Procedural Language. SQL—Structure QueryLanguage.PL/SQL包括过程化语句和SQL语句     PL/SQL的单位:块. 一个块中可以嵌套

Oracle之PL/SQL学习笔记之触发器

Oracle之PL/SQL学习笔记之触发器 触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行. 即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数.所以运行触发器就叫触发或点火(firing).ORACLE事件指的是对数据库的表进行的INSERT. UPDATE及D

Oracle之PL/SQL学习笔记之数据类型(三)

Oracle之PL/SQL学习笔记之数据类型(三) 所有的编程语言中变量是使用最频繁的.PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到动态执行程序,同时也可以利用变量在PL/SQL内部进行值得传递,甚至可以把值传递出去,最终返回给用户,由此可见,变量是PL/SQL不可或缺的一部分. 1. Oracle预定义的普通数据类型(常见的数据类型) 类型 子类 说明 Oracle中的范围 char Character,String Rowi

Oracle之PL/SQL学习笔记之序言(一)

1. PL/SQL是什么? PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断.循环等操作实现复杂的功能或者计算.PL/SQL 只有 Oracle 数据库有. 2. PL/SQL的优点 1. 提高应用程序的运行性能 传统的java程序传递sql到Oracle服务器

PL/SQL学习笔记_03_存储函数与存储过程

ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数. 存储函数:有返回值,创建完成后,通过select function() from dual;执行 存储过程:由于没有返回值,创建完成后,不能使用select语句,只能使用pl/sql块执行 一.存储函数 1.存储函数语法格式 CREATE [OR REPLACE] FUNCTION function_name [ (argment [ { IN | IN OUT } ] Type, a

PL/SQL学习笔记之基本块格式与语法

一:PL/SQL程序块 PL/SQL是一种块结构的语言,一个PL/SQL程序就是一个 代码逻辑块. PL/SQL程序由三部分构成: 1 声明 部分 使用关键字DECLARE开头,它是一个可选的部分,用于声明与赋初值在该程序中使用的  所有变量,游标,子程序,和其他元素. 2 可执行命令 部分 使用关键字BEGIN和END包裹,必须有.定义了一系列 PL/SQL语句  . 3 异常处理 部分 使用关键字EXCEPTION,可选,用于处理可执行命令部分捕获的异常. 二:基本格式 DECLARE <d

FW:Oracle之PL/SQL学习笔记

看到一个关于Oracle系列文章,基本集中在一些基础知识的汇总. 比较适合新员工培训和知识汇总回顾.记录之前不了解或者不确定的知识 http://my.oschina.net/KingPan/blog?catalog=504011 1.得到序列的下一个值或当前值 select your_sequence.nextval from dual;--获得序列your_sequence的下一个值 select your_sequence.currval from dual;--获得序列your_sequ

Pl/sql学习笔记2

? -- declare type vsal_table is table of emp.sal%type; a vsal_table; begin --必须得初始化 并且有数量上的区分 从一开的 a:=vsal_table(1000,2000,30000); dbms_output.put_line(a(1)); end; ? ? --使用嵌套表的案例 --定义一个类型 create type stu_name is table of varchar2(20); ? create table

大话设计模式学习笔记——面向对象基础

前言 好记性不如烂"笔头"系列--大话设计模式学习笔记 目录 面向对象基础 面向对象基础 什么是类与实例 一切事物皆为对象,即所有的东西老师对象,对象就是可以看到.感觉到.听到.触摸到.尝到.或闻到的东西.准确地说,对象是一个自包含的实体,用一组可识别的特性和行为来标识.面向对象编程,英文叫 Object-Oriented Programming,其实就是针对对象来进行编程的意思.类就是具有相同属性和功能的对象的抽象集合.实例就是一个真实的对象.比如我们属于'人'类,而个人就是'人'类