Oracle学习笔记4:pl/sql

时间:2021-01-16 05:15:30

1.什么是pl/sql?

  sql:结构化查询语言

  pl/sql:(Procedure Language&Structured Query Language)是对sql语言,存储过程语言的拓展。它可以像Java语言等一样实现简单的逻辑编程。

2.pl/sql的优点?

  引自博主https://www.cnblogs.com/huyong/archive/2011/05/16/2047329.html 更多详细内容查看原文

  1.有利于客户/服务器环境应用的运行

  2.适合于客户环境

  3.过程化

  4.模块化

  5.运行错误可处理性

  6.提供大量内置程序包

3.pl/sql的使用

declare-- declare 可以省略
  --声明部分,在这里声明pl/sql用到的变量,游标,以及局部的存储过程及函数
begin -- 程序开始部分,不可省略,相当于java中的大括号{
    --执行部分 过程及sql语句,是程序的主要部分
  exception 
    --异常处理部分(可以省略)
end; --程序结束部分,不可省略相当于结尾大括号}

  pl/sql块可以分为:

  1.匿名块:没有名字的语句块,只能执行一次,可以调用其他程序,不能被其他程序调用

  2.命名块:带有名称的匿名块,这个名称就是标签

  3.子程序:存储在数据库中的存储过程、函数等,当在数据库中建立好后可以在其他程序中调用他们。

  4.程序包:存储在数据库中的一组子程序,定义变量,在包中的子程序可以被其他程序包或子程序调用,但如果声明的是局部子程序,则只能在定义该局部子程序的块中调用该局部子程序

  5.触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序

4.标识符

  pl/sql中的标识符与sql中的标识符定义基本相同,要求和限制有:

  1.标识符名不能超过30个字符

  2.第一个字符必须为子母

  3.不分大小写

  4.不能为-号

  5.不能为sql保留字

  关于sql命名以及数据类型等https://www.cnblogs.com/huyong/archive/2011/05/10/2041951.html

匿名块举例:

  举例:根据员工的编号,查询员工的姓名

declare 
     v_empno number:=7369;--定义变量赋值 (:=)
     v_ename varchar2(20);
begin
       --解释本句,查询emp表中员工编号为变量v_empno的员工的姓名,将姓名放入变量v_ename中
    select ename into v_ename from emp where empno=v_empno;
       --输出命令,拼接字符串为||
    dbms_output.put_line('员工的名字:'||v_ename);
end;

 

pl/sql中变量赋值:

v_empno number:=7369

常量赋值:

 v_empno constant number:=7369 --关键字constant表示为常量

引用类型变量:

  在pl/sql中,引用类型变量有 :

     列引用类型   %type   

     行引用类型   %rowtype

    记录类型  %record

    表格类型  %table

举例:

--列引用类型
declare
    v_empno emp.empno%type;--列引用类型用法需要表名.列名来声明是那儿一列
    v_ename varchar(20);
begin
    select empno into v_empno from emp where ename='ALLEN';
    dbms_output.put_line('员工编号:'||v_empno);
end;
    
  
--行引用类型  
declare
    v_row emp%rowtype;--行引用类型表名%rowtype表示为那儿张表
    v_empno number(7):=7369;
begin
  select * into v_row from emp where empno=v_empno;
  dbms_output.put_line('员工姓名:'||v_row.ename||'员工部门:'||v_row.job);
end;

--记录类型(复杂的数据类型)
--举例根据员工号查询员工信息
declare
--定义一个记录类型,就像创建一个表 一样
type emp_record_type is record(
     v_empno emp.empno%type,--逗号结尾
     v_ename emp.ename%type--最后一条不用逗号
);

v_emp emp_record_type;--声明变量v_emp为记录类型
begin 
  select empno,ename into v_emp from emp where empno=7369;--要注意查询的数据条数要与记录中的条数对应,这里如果是select * 就会报错
  dbms_output.put_line('结果为:'||v_emp.v_empno);--输出时必须写明输出的数据是哪儿一条,直接输出v_emp报错
end; 

--table类型,键值的集合,record的集合
--根据员工号查询员工信息
declare
/*定义table类型,
  of数据类型,基本的数据类型,引用类型..
  index by 索引类型*/
  type emp_table_type is table of emp%rowtype index by binary_integer;
  v_emp emp_table_type;
begin
  --错误 select * into v_emp from emp where empno=7369;
  select * into v_emp(0) from emp where empno=7369; 
   select * into v_emp(1) from emp where empno=7499; 
   dbms_output.put_line(v_emp(0).empno||v_emp(0).ename);
    dbms_output.put_line(v_emp(1).empno||v_emp(1).ename);
end;