`

plsql匿名块、record、table、type、rowtype、异常

 
阅读更多

/**
1.1 pl/sql(数据库编程):是对表中的sql语句的扩展,扩展了过程化的控制
1.2
 变量:
数据类型:varchar2(len),nvarchar2(len),char(len),date,boolean,number(p,s)
运算符:|| and or not != <>
逻辑控制:
循环结构:
1.3.pl/sql块:下面相当于一个方法,没有名字,因此叫匿名块。declare(声明)
declare
     定义变量,v是变量的意思
 begin
    写sql或者pl/sql语句
 exception
      异常处理  
  end; 
**/
------------------------------------------
declare
   -- v_name varchar(20):='乌龟';--声明变量,同时赋值(第一种赋值)
     v_name varchar(20);
  begin
    v_name:='乌龟';---赋值(第二种赋值)
    select sname into v_name from student where sno='112';--into的意思是把学生表的sname赋值给v_name(第三中赋值)
    dbms_output.put_line(v_name);---打印变量的值,相当于system.out.println()
   end;
--------------------------------
 ---逻辑控制。if else,输出大年龄
 declare
     v_age number(5):=22;
     v_age2 number(5):=10000;
  begin  ----- if then endif相当于if语句。v_age>v_age2是判断条件,dbms_output.put_line('v_age:' ||v_age)是输出的结果
   if v_age>v_age2 then
     dbms_output.put_line('v_age:' ||v_age);
   else
       dbms_output.put_line('v_age2:' ||v_age2);
   end if; 
   end;
-------------------------------------
---逻辑控制。多重if
 declare
     v_age number(5):=22;
     v_age2 number(5):=10000;
  begin 
   if v_age>v_age2 then
     dbms_output.put_line('v_age=' ||v_age);
   elsif v_age=v_age2  then---elsif在java中相当于else if
     dbms_output.put_line('v_age2=' ||v_age2 ||'v_age:' ||v_age);
   else
     dbms_output.put_line('v_age2=' ||v_age2 );---数据管理系统
   end if; 
   end;
-------------------
---逻辑控制。case等值判断。(在java中就是switch,等值判断)
 declare
     v_grade number(1):=8;  
  begin 
   case
     when v_grade=1 then  dbms_output.put_line('☆');
     when v_grade=2 then  dbms_output.put_line('☆☆');
     when v_grade=3 then  dbms_output.put_line('☆☆☆');
     when v_grade=4 then  dbms_output.put_line('☆☆☆☆');
     else dbms_output.put_line('☆☆☆☆11111111');
     end case;
   end;
----------- 
--逻辑控制。case区间判断
 declare
     v_grade number(3):=89;  
  begin 
   case
     when v_grade>=90 then  dbms_output.put_line('A');
     when v_grade>=80 then  dbms_output.put_line('B');
     when v_grade>=60 then  dbms_output.put_line('c');
     when v_grade<60then  dbms_output.put_line('d');
     end case;
   end;
 --------------------
   ---逻辑控制。case用在select中。好像跟sign()很相似
   select sname,
   case
     when sage>40 then '中上'
     when sage>30 then '中上'
     when sage>20 then '中上'
     when sage<20 then '中上'
         end case
         from student
 ---==================================================================
 ------第二部分:循环控制
 -----循环结构 loop
  declare
     v_x number(6):=1;  
  begin 
  loop ---循环的意思,loop是个死循环
    dbms_output.put_line(v_x);
    if  v_x =100 then
      exit;---强制退出循环
      end if ;
    v_x:=v_x+1;---结果缓冲区溢出,因为超过10000个字节了。因为这是个死循环
  end loop;
   end;
 -------------------
  ---循环结构 for 。。in后面是个集合
    declare
     v_x number(6):=1;  
  begin 
   for v_x in 1..100 loop ---loop就相当于左大括号,end loop就相当于右边大括号
    dbms_output.put_line(v_x);
 
  end loop;
   end;
  ---------------------
 -- 循环结构 while
    declare
     v_x number(6):=1;  
  begin 
   while v_x<=120 loop
    dbms_output.put_line(v_x);
  v_x:=v_x+1;
  end loop;
   end;
  
------------------------
------第三部分:oracle 复合数据类型(其实就是java中的引用类型)
---1.record记录类型
--record:就相当于创建类(更确切的说应该是创建表,因为格式更像是创建表,
--因为他里面的内容都放在了一对括号里了,每个字段后面用逗号,而不是分号,最后一个字段不用逗号)
    declare
    ---- 1.定义一个复合类型v_r  (type是定义类型,相当于定义类,名字v_r)。完成的就是对类的定义和给类中属性赋值
    type v_r is record
    (
    v_x varchar(20),---这三行相当于是给类加上属性,更确切的说就是成员对象(或者说是在建表)
    v_y varchar(20),
    v_z varchar(20)
    );----这个表是个整体,因此结束的时候要分号
    ---2.定义复合类型的变量(相当于java创建对象)
    v_n v_r;
  begin 
    --这个sql块想要说明的就是v_n.v_x(对象.属性)的使用
  -- v_n.v_x:='安娜';---相当于在java中的利用对象调用属性
  --v_n.v_z:='令狐冲';
  -- v_n.v_y:=23;
   select sname,saddress,sage into v_n.v_x,v_n.v_y,v_n.v_z from student  where sno='112';---这个sql块想要说明的就是v_n.v_x(对象.属性)的使用
   dbms_output.put_line(v_n.v_x);
   dbms_output.put_line(v_n.v_y);
   dbms_output.put_line(v_n.v_z);
   end;
----用处:定义一个record变量存放第二条记录, 并输出结果
--------------------------------------------------------
  
 ----2.table类型(相当于数组) :总结一下:自己指定数组名字,数组类型,索引类型,索引名字,不用给数组指定大小,因为他自己会增加 。完成的就是对数组的定义和赋值
  declare
   ---1.声明table类型,of varchar2(23)是数组中元素的类型,index by 是索引的类型。v_t是数组类型.索引不用指定大小,会一直增加。索引的类型自己指定,
   ---(索引类型改成number不行(改成其他的不受限制)。因为number可以出现小数位)
   type v_t is table of varchar2(23) index by varchar2(3);
   ---2.定义v_t类型的变量,现在v_a就是数组变量
   v_a v_t;
  begin 
   select sname,saddress into v_a('1'),v_a('2')  from student where sno='112';----这里的1,2代表索引(类型是varchar2(3))。这索引也是自己定义的。但是要注意在select后面的列的类型,要跟数组的类型一致
dbms_output.put_line(v_a('x'));
   end;
----用处:定义一个table 类型变量存放3条记录, 并输出结果
---==================================================== 
---第四部分:扩展变量类型
----题:把表中某列的值赋值到一个变量里,但是我不知道这些列的数据类型
---1.%type  赋值某一列(一个字段)
declare
  v_name student.sname%type;----student.sname%type是student表中的sname列的数据类型
  v_age student.sage%type;
  begin
    select sname ,sage into v_name,v_age from student where sno='112';---into是把sname的值给v_name
    dbms_output.put_line(v_name);
    dbms_output.put_line(v_age);
    end;
---2.%rowtype   赋值某一行(也就是所有列)
declare
  v_x student%rowtype;----student.sname%type将sname变量的数据类型赋值
  begin
    select sname,sage into v_x.sname,v_x.sage from student where sno='112';
    dbms_output.put_line(v_x.sname);
    dbms_output.put_line(v_x.sage);
    end;
------这两个的用处:用pl/sql实现输出7369号员工的姓名
--=================================================
-----第五部分:异常
---1.java中用异常类来描述(描述类名和异常的具体产生信息,异常编号)。
     ---oracle中描述异常:
             ---异常名字
             --异常的具体描述信息
             --异常编号
---2.oracle中异常的分类,按照异常名称分类
   ---预定义异常:名称,描述,编号都由oracle系统提供(相当于java的异常类)
   ---非预定义异常:指提供描述和编号(没有名字的异常)
   ---自定义异常:三无。名称,描述和编号都由程序员自己提供
--------------------------------------------------
-----预定义异常。异常1
declare
   v_num number(3):=10;
   v_num2 number(3):=0;
   v_num3 number(3);
begin
  v_num3 :=v_num/v_num2;
exception
    when ZERO_DIVIDE  then---除零异常
      --dbms_output.put_line('这里有除数为0异常');--这里汉字就是描述
    dbms_output.put_line(sqlcode||'----'||sqlerrm);--系统编号sqlcode和中文描述sqlerrm
       when others then---所有异常,others相当于exception
      dbms_output.put_line('这里有异常');
end;
---------------------------
--预定义异常 异常2
declare

       v_name varchar2(20);
begin
       ---select sname into v_name from student where sno='112';--应该这样写,但是为了测试异常没有加where条件
       select sname into v_name from student;
exception
       when too_many_rows then-----实际返回的行数超出请求的行数,因为sname能查出好多,而v_name只能保存一个
       dbms_output.put_line(sqlcode||'鄙视你'||sqlerrm);
end;
-----
--------第二种:非预定义异常
declare
---1.声明异常名字
   v_bajie exception;----这跟定义变量一样,变量名字 变量类型
----2.给非预定义异常编号为2291的异常绑定一个名字,名字为v_bajie
--(因为名字都是程序员起的,因此在系统中根本不可能给他编号,,因此要程序员自己给绑定编号。程序员要用20000-20999之间的数)
  pragma exception_init(v_bajie,-2291) ;
begin
 insert into score values('129','200','3',2);---添加成绩的时候要考虑主外键关系,129和200都是外检,但是在主表中没有这个数据
  exception
    when v_bajie then
     dbms_output.put_line(sqlcode||' 八戒异常 '||sqlerrm);
end; 

-------
---第三种异常:自定义异常
declare
---假设描述仓库管理员,当数量小于5的时候产生异常
v_count number(3):=2; ---声明变量,表示库存数量
 ---1.声明名称
   v_wkex  exception ;
  ---2.将异常名称和异常编号进行绑定。其中,pragma是编译指令,在编译是时候被处理,不在运行的时候执行
  pragma exception_init(v_wkex,-20001);
begin
 
  ---3.产生异常(引发异常,就是抛出)
  if v_count<5  then
   --  raise v_wkex ;--1.抛出。这种方式不能进行描述
   raise_application_error(-20001,'异常描述,库存不足');---2.进行关联,把名称和描述关联。自己描述的
    end if;
  exception
    ---4.使用名称进行处理
     when v_wkex then
   dbms_output.put_line(sqlcode||'    '||sqlerrm);---此时的编号是自己定义的编号-20001,描述也是自己的描述:异常描述,库存不足
end;

分享到:
评论

相关推荐

    PLSQL高级编程资料

    TYPE emp_table IS TABLE OF employee%ROWTYPE INDEX BY BINARY_INTEGER; emps emp_table; emps_max BINARY_INTEGER; BEGIN OPEN all_emps; FETCH all_emps BULK COLLECT INTO emps; CLOSE all_emps; -- ...

    plsql基本语法ppt

    TYPE var_type IS TABLE OF table_name%ROWTYPE INDEX BY PLS_INTEGER; var var_type; -- 定义过程和函数 PROCEDURE proc_name (input_param IN NUMBER, output_param OUT NUMBER); FUNCTION func_name (input...

    PLSQL语法总结笔记

    TYPE dept_rec IS RECORD ( -- 定义名为dept_rec的记录类型 v_deptno DEPT.deptno%TYPE, v_dname DEPT.dname%TYPE ); dept_rec1 dept_rec; -- 定义一个dept_rec类型的变量dept_rec1 BEGIN SELECT deptno, ...

    PLSQL简介.pdf

    TYPE EmployeeRecordType IS RECORD ( emp_id employees.emp_id%TYPE, first_name employees.first_name%TYPE, last_name employees.last_name%TYPE, salary employees.salary%TYPE, department_id employees....

    PLSQL 学习笔记

    此外,还有PL/SQL特有的记录类型(RECORD)和集合类型(VARRAY、TABLE)。 3. PLSQL的变量声明: 变量可以通过%TYPE关键字声明为已存在的表列的数据类型,这有助于保持数据一致性。例如:`DECLARE my_variable emp....

    Oracle_plsql程序设计基础

    TYPE TYPE_DEPT IS TABLE OF DEPT%ROWTYPE INDEX BY BINARY_INTEGER; tb TYPE_DEPT; BEGIN tb(1).ID := '001'; tb(2).ID := '001'; DBMS_OUTPUT.PUT_LINE(tb.COUNT); END; / ``` 这里,`tb`是一个包含了`DEPT`...

    PLSQL作业 PLSQL作业 PLSQL作业 PLSQL作业 PLSQL作业 PLSQL作业

    1. **变量与数据类型**:PL/SQL支持多种内置数据类型,如 NUMBER、VARCHAR2、DATE、BOOLEAN等,以及复合数据类型如纪录(RECORD)和表(TABLE)。声明变量时需指定其类型,如`DECLARE my_num NUMBER;`。 2. **流程...

    Oracle PLSQL编程讲义

    块的基本结构包括BEGIN、END关键字,可以是匿名块(一次性执行)或命名块(如存储过程)。 #### §2.2 PL/SQL结构 - **DECLARE** 部分:声明变量、常量、游标、记录等。 - **BEGIN** 部分:包含执行的语句和逻辑。...

    oracle plsql基本语法

    PL/SQL 中的匿名块是执行 PL/SQL 代码的基本单元,它通常由以下四个部分组成: 1. **DECLARE**: 用于声明变量或游标,这部分是可选的。 2. **BEGIN**: 执行语句的开始标记,这一部分是必需的。 3. **EXCEPTION**: ...

    PLSQL_Oracle 编程讲义

    PL/SQL块有三种类型:匿名块(也称为直译块)、命名块(如存储过程、函数)和触发器。 #### §2.3 标识符 在PL/SQL中,标识符用于变量、常量、表名等的命名,必须遵循特定的命名规则。 #### §2.4 PL/SQL变量类型 ...

    plsql复合数据类型

    TYPE emp_record IS ROWTYPE OF c_emp; v_emp emp_record; ``` **3. 使用记录** - **引用记录的域**:可以通过点操作符(`.`)来访问记录中的各个域。例如: ```sql v_emp.id := 100; v_emp.name := 'John ...

    PLSQL教程.doc

    TYPE emp_table IS TABLE OF employees%ROWTYPE INDEX BY PLS_INTEGER; emp_array emp_table; BEGIN SELECT * BULK COLLECT INTO emp_array FROM employees WHERE department_id = 30; FOR i IN 1..emp_array....

    ORACLE_PLSQL_基础教程

    ### ORACLE_PLSQL_基础教程 #### 一、PL/SQL 变量与数据类型 在 Oracle PL/SQL 中,变量是用来存储数据的基本单位。理解并掌握这些变量及其数据类型对于编写有效的 PL/SQL 代码至关重要。 ##### 1.1 数据类型介绍...

    PLSQL编程03

    本节我们将深入探讨PL/SQL中的自定义复合变量,以及`%TYPE`和`%ROWTYPE`这两个关键特性在编程中的应用。 首先,自定义复合变量允许我们创建包含多个数据类型的结构化变量,这在处理复杂数据模型时非常有用。例如,...

    PLSQL_ORACLE9i编程讲义

    复合类型如记录(RECORD)和表(TABLE)允许创建自定义数据结构,方便处理复杂的数据集。 - §2.4.3 使用%ROWTYPE %ROWTYPE关键字可以创建一个变量,其数据结构与指定表的一行相同,便于从查询结果中直接赋值给变量...

    plsql_oracle

    复合类型如记录(RECORD)和数组(TABLE)允许创建自定义的数据结构。%ROWTYPE关键字用于创建与表列结构相匹配的变量,便于操作单行数据。LOB(Large Object)类型用于存储大对象,如图像、音频或大型文本文件。 在...

    PLSQL_笔记版教程_PDF

    它可以是匿名块(一次性执行)或命名块(如过程、函数、包)。 - PL/SQL结构 包含BEGIN、END关键字的代码块构成了PL/SQL的主体,中间可以嵌套其他块或SQL语句。 - 标识符 在PL/SQL中,标识符用于变量、常量、...

    PLSQL Program Design

    - **复合类型**: 包括RECORD和TABLE等。 - **%ROWTYPE**: 用于表示表或视图的一行记录。 - **LOB类型**: Large Object,用于存储大对象如文本、图像等。 - **Bind变量**: 用于在SQL语句中引用外部变量。 **2.5 ...

    ORACLE_PLSQL存储过程教程.doc

    此外,RECORD类型允许自定义记录结构,例如`TYPE record_name IS RECORD(field1 type, field2 type...)`,而TABLE类型可以用来创建动态数组,类似于集合。 通过这些基本概念和技巧,开发者可以有效地利用Oracle PL/...

Global site tag (gtag.js) - Google Analytics