【永利官网ylg客户端】oracle调控语句

 

         emp_rec emp%ROWTYPE;

 

–PLS_INTEGER操作的数大于其数据范围里会抛出异常

<>,!=

永利官网ylg客户端 1
永利官网ylg客户端 2
IF <布尔表达式> THEN
  PL/SQL 和 SQL语句

DECLARE v_x NUMBER:=30; BEGIN  DECLARE  v_x VARCHAR2(40):='JAVA 学习';  v_y NUMBER:=20;  BEGIN   dbms_output.put_line('内部程序块输出v_x= '||v_x);   dbms_output.put_line('内部程序块输出v_y= '||v_y);  END;  dbms_output.put_line('外部程序块输出v_x= '||v_x);END;

       LOOP

2.2   PL/SQL结构

l       PL/SQL块中可以包含子块;

l       子块可以位于 PL/SQL中的任何部分;

l       子块也即PL/SQL中的一条命令;

 

 

NOT True

  1. 赋值

    n:=12;mm:=100;

END;

exit(exit when);

 

连接运算符

EXCEPTION STATEMENTS

2.6.1  字符及数字运算特点

 

空值加数字仍是空值:NULL + < 数字> = NULL

 

空值加(连接)字符,结果为字符:NULL || <字符串> = < 字符串>

 

–字符型

–查询员工SMITH的所有信息

  1. 定义变量

    declare n integer; //定义单个变量//定义多个变量DECLARE n integer;mm integer;

 –IF ELSE

       DBMS_OUTPUT.PUT_LINE(‘薪水上升20%’);

 

DECLARE v_dno      dept.deptno%TYPE:=&deptno; --部门编号 v_dna      dept.dname%TYPE:='&dname'; ---部门名称 v_dloc     dept.loc%TYPE:='&loc';  -- 部门位置 v_deptCount   NUMBER;      --保存count()函数的结果BEGIN SELECT COUNT(deptno) INTO v_deptCount FROM dept WHERE deptno=v_dno; IF v_deptCount > 0 THEN  raise_application_error(-20888,'此部门编号已经存在,请重新输入 ');  ELSE   INSERT INTO dept(deptno,dname,loc)VALUES(v_dno,v_dna,v_dloc);   dbms_output.put_line('新增加部门成功');   COMMIT;  END IF;  EXCEPTION   WHEN OTHERS THEN    dbms_output.put_line(SQLERRM);    ROLLBACK;END;

  DBMS_OUTPUT.PUT_LINE(‘所属部门:’||BUMENG);

 

—嵌套语法

    END CASE;

2.5.1  关系运算符

 

运算符

意义

=

等于

<> , != , ~= , ^=

不等于

小于

大于

<=

小于或等于

>=

大于或等于

 

 

DECLAREv_id     emp.empno%TYPE:=&empno;  --用户输入编号v_deptno   emp.deptno%TYPE;     --变量部门编号v_sal     emp.sal%TYPE ;      --变量工资BEGIN SELECT deptno ,sal INTO v_deptno,v_sal FROM emp WHERE empno=v_id; IF v_deptno=10 THEN  IF v_sal*1.1>5000 THEN   dbms_output.put_line(v_id||'涨工资后'|| 5000||'元');   ELSE    dbms_output.put_line(v_id||'涨工资后'||v_sal*1.1);   END IF;  ELSIF v_deptno=20 THEN    IF v_sal*1.2>5000 THEN   dbms_output.put_line(v_id||'涨工资后'|| 5000||'元');   ELSE    dbms_output.put_line(v_id||'涨工资后'||v_sal*1.2);   END IF;   ELSIF v_deptno=30 THEN    IF v_sal*1.3>5000 THEN   dbms_output.put_line(v_id||'涨工资后'|| 5000||'元');   ELSE    dbms_output.put_line(v_id||'涨工资后'||v_sal*1.3);   END IF;   ELSE    NULL;  END IF;END;

                  
ERROR_MESSAGE:是用户为异常指定的消息,消息的长度可达2048字节。

2.6.4  可转换的类型赋值

 

l       CHAR 转换为 NUMBER:

使用 TO_NUMBER 函数来完成字符到数字的转换,如:

v_total := TO_NUMBER(‘100.0’) + sal;

 

l       NUMBER 转换为CHAR:

    使用 TO_CHAR函数可以实现数字到字符的转换,如:

 v_comm := TO_CHAR(‘123.45’) || ‘元’ ;

 

l       字符转换为日期:

使用 TO_DATE函数可以实现  字符到日期的转换,如:

v_date := TO_DATE(‘2001.07.03′,’yyyy.mm.dd’);

 

l       日期转换为字符

使用 TO_CHAR函数可以实现日期到字符的转换,如:

v_to_day := TO_CHAR(SYSDATE, ‘yyyy.mm.dd hh24:mi:ss’) ;

 

关键字reverse 只有在需要从大到小执行循环时才会使用。

2.4.5  BIND 变量

绑定变量是在主机环境中定义的变量。在PL/SQL 程序中可以使用绑定变量作为他们将要使用的其它变量。为了在PL/SQL 环境中声明绑定变量,使用命令VARIABLE。例如:

 

 

VARIABLE return_code NUMBER
VARIABLE return_msg VARCHAR2(20)

 

可以通过SQL*Plus命令中的PRINT 显示绑定变量的值。例如:

 

 

PRINT return_code
PRINT return_msg

 

例10:

 

 

永利官网ylg客户端 3
 
VARIABLE result NUMBER;
BEGIN
  SELECT (sal*10)+nvl(comm, 0) INTO :result FROM emp 
  WHERE empno=7844;
END;
–然后再执行
PRINT result
 
永利官网ylg客户端 4

 

 

2.4.6  PL/SQL 表(TABLE)

定义记录表(或索引表)数据类型。它与记录类型相似,但它是对记录类型的扩展。它可以处理多行记录,类似于高级中的二维数组,使得可以在PL/SQL中模仿数据库中的表。

 

定义记录表类型的语法如下:

 

 

TYPE table_name IS TABLE OF element_type [NOT NULL]
INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARRAY2];

 

关键字INDEX BY表示创建一个主键索引,以便引用记录表变量中的特定行。

 

方法

描述

EXISTS(n)

如果集合的第n个成员存在,则返回true

COUNT

返回已经分配了存储空间即赋值了的成员数量

FIRST

LAST

FIRST:返回成员的最低下标值

LAST: 返回成员的最高下标值

PRIOR(n)

返回下标为n的成员的前一个成员的下标。如果没有则返回NULL

NEXT(N)

返回下标为n的成员的后一个成员的下标。如果没有则返回NULL

TRIM

TRIM:删除末尾一个成员

TRIM(n) :删除末尾n个成员

DELETE

DELETE:删除所有成员

DELETE(n) :删除第n个成员

DELETE(m, n) :删除从n到m的成员

EXTEND

EXTEND:添加一个null成员

EXTEND(n):添加n个null成员

EXTEND(n,i):添加n个成员,其值与第i个成员相同

LIMIT

返回在varray类型变量中出现的最高下标值

 

例11:

 

永利官网ylg客户端 5
 
DECLARE
  TYPE dept_table_type IS TABLE OF 
       dept%ROWTYPE INDEX BY BINARY_INTEGER;
  my_dname_table dept_table_type;
  v_count number(2) :=4;
BEGIN
  FOR int IN 1 .. v_count LOOP
    SELECT * INTO my_dname_table(int) FROM dept WHERE deptno=int*10;
  END LOOP;
  FOR int IN my_dname_table.FIRST .. my_dname_table.LAST LOOP
  DBMS_OUTPUT.PUT_LINE(‘Department number: ‘||my_dname_table(int).deptno);
  DBMS_OUTPUT.PUT_LINE(‘Department name: ‘|| my_dname_table(int).dname);
  END LOOP;
END;
 
永利官网ylg客户端 6

 

例12:按一维数组使用记录表

 

 

永利官网ylg客户端 7
 
DECLARE
–定义记录表数据类型
   TYPE reg_table_type IS TABLE OF varchar2(25)
   INDEX BY BINARY_INTEGER;
–声明记录表数据类型的变量
   v_reg_table REG_TABLE_TYPE;
   
BEGIN
   v_reg_table(1) := ‘Europe’;
   v_reg_table(2) := ‘Americas’;
   v_reg_table(3) := ‘Asia’;
   v_reg_table(4) := ‘Middle East and Africa’;
   v_reg_table(5) := ‘NULL’;   DBMS_OUTPUT.PUT_LINE(‘地区名称:’||v_reg_table (1)||’、’
                                    ||v_reg_table (2)||’、’
                                    ||v_reg_table (3)||’、’
                                    ||v_reg_table (4));
   DBMS_OUTPUT.PUT_LINE(‘第5个成员的值:’||v_reg_table(5));
END;
 
永利官网ylg客户端 8

 

例13:按二维数组使用记录表

永利官网ylg客户端 9
 
DECLARE
–定义记录表数据类型
   TYPE emp_table_type IS TABLE OF employees%ROWTYPE
   INDEX BY BINARY_INTEGER;
–声明记录表数据类型的变量
   v_emp_table EMP_TABLE_TYPE;
BEGIN
   SELECT first_name, hire_date, job_id INTO
   v_emp_table(1).first_name,v_emp_table(1).hire_date, v_emp_table(1).job_id
   FROM employees WHERE employee_id = 177;
   SELECT first_name, hire_date, job_id INTO
   v_emp_table(2).first_name,v_emp_table(2).hire_date, v_emp_table(2).job_id
   FROM employees WHERE employee_id = 178;   DBMS_OUTPUT.PUT_LINE(‘177雇员名称:’||v_emp_table(1).first_name
             ||’  雇佣日期:’||v_emp_table(1).hire_date
             ||’  岗位:’||v_emp_table(1).job_id);
   DBMS_OUTPUT.PUT_LINE(‘178雇员名称:’||v_emp_table(2).first_name
             ||’  雇佣日期:’||v_emp_table(2).hire_date
             ||’  岗位:’||v_emp_table(2).job_id);
END;
 
永利官网ylg客户端 10

 

 

2.5   运算符和表达式(数据定义)

—-BINARY_INTEGER与
PLS_INTEGER采用二进制的补码形式存储,所以性能上要比NUMBER高

–变量直接赋值 

 

 

DEPTNO DEPT_VIEW.DEPTNO%TYPE;

2.6.3  数据库赋值

 

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

例14:

 

永利官网ylg客户端 11
 
DECLARE
  emp_id    emp.empno%TYPE :=7788;
  emp_name  emp.ename%TYPE;
  wages     emp.sal%TYPE;
BEGIN
  SELECT ename, NVL(sal,0) + NVL(comm,0) INTO emp_name, wages 
  FROM emp WHERE empno = emp_id;
  DBMS_OUTPUT.PUT_LINE(emp_name||’—-‘||to_char(wages));
END;
 
永利官网ylg客户端 12

 

*提示:不能将SELECT语句中的列赋值给布尔变量。*

 

–异常

=

l 控制语句: IF 语句

 –定义DATE型变量

DECLARE

2.1   PL/SQL块

PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分。

 

PL/SQL块的结构如下:

 

永利官网ylg客户端 13
 
 DECLARE  
    –声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数
  BEGIN
    — 执行部分:  过程及SQL 语句  , 即程序的主要部分
  EXCEPTION
    — 执行异常部分: 错误处理
  END;
 
永利官网ylg客户端 14

 

 

其中:执行部分不能省略。

 

PL/SQL块可以分为三类:

 

1.        无名块或匿名块(anonymous):动态构造,只能执行一次,可调用其它程序,但不能被其它程序调用。

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

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

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

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

 

  DEPTNO:=50;

本篇主要内容如下:

 

 

2.4.2.3 使用%TYPE

定义一个变量,其数据类型与已经定义的某个数据变量(尤其是表的某一列)的数据类型相一致,这时可以使用%TYPE。

使用%TYPE特性的优点在于:

l         所引用的数据库列的数据类型可以不必知道;

l         所引用的数据库列的数据类型可以实时改变,容易保持一致,也不用修改PL/SQL程序。

 

例7:

 

 

永利官网ylg客户端 15
 
DECLARE
   — 用%TYPE 类型定义与表相配的字段
   TYPE T_Record IS RECORD(
        T_no emp.empno%TYPE,
        T_name emp.ename%TYPE,
        T_sal emp.sal%TYPE );
   — 声明接收数据的变量
   v_emp T_Record;
BEGIN
   SELECT empno, ename, sal INTO v_emp FROM emp WHERE empno=7788;
   DBMS_OUTPUT.PUT_LINE
    (TO_CHAR(v_emp.t_no)||’ ‘||v_emp.t_name||’  ‘ || TO_CHAR(v_emp.t_sal));
END;
 
永利官网ylg客户端 16

 

例8:

 

 

永利官网ylg客户端 17
 
DECLARE
   v_empno emp.empno%TYPE :=&no;
   Type t_record is record (
        v_name   emp.ename%TYPE,
        v_sal    emp.sal%TYPE,
        v_date   emp.hiredate%TYPE);
   Rec t_record;
BEGIN
   SELECT ename, sal, hiredate INTO Rec FROM emp WHERE empno=v_empno;
   DBMS_OUTPUT.PUT_LINE(Rec.v_name||’—‘||Rec.v_sal||’–‘||Rec.v_date);
END;
 
永利官网ylg客户端 18

 

 

2.4.3  使用%ROWTYPE

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

使用%ROWTYPE特性的优点在于:

l         所引用的数据库中列的个数和数据类型可以不必知道;

l         所引用的数据库中列的个数和数据类型可以实时改变,容易保持一致,也不用修改PL/SQL程序。

 

例9:

 

 

永利官网ylg客户端 19
 
DECLARE
    v_empno emp.empno%TYPE :=&no;
    rec emp%ROWTYPE;
BEGIN
    SELECT * INTO rec FROM emp WHERE empno=v_empno;
    DBMS_OUTPUT.PUT_LINE(‘姓名:’||rec.ename||’工资:’||rec.sal||’工作时间:’||rec.hiredate); 
END;
 
永利官网ylg客户端 20

 

 

2.4.4  LOB类型

    ORACLE提供了LOB (Large
OBject)类型,用于存储大的数据对象的类型。ORACLE目前主要支持BFILE, BLOB,
CLOB 及 NCLOB 类型。

 

BFILE (Movie)

    存放大的二进制数据对象,这些数据文件不放在数据库里,而是放在操作系统的某个目录里,数据库的表里只存放文件的目录。

 

BLOB(Photo)

    存储大的二进制数据类型。变量存储大的二进制对象的位置。大二进制对象的大小<=4GB。

 

CLOB(Book)

    存储大的字符数据类型。每个变量存储大字符对象的位置,该位置指到大字符数据块。大字符对象的大小<=4GB。

 

NCLOB

    存储大的NCHAR字符数据类型。每个变量存储大字符对象的位置,该位置指到大字符数据块。大字符对象的大小<=4GB。

 

 

  FOR COUNTS IN 1..10

3.1  条件语句

 

 

2.6   变量赋值

在PL/SQL编程中,变量赋值是一个值得注意的地方,它的语法如下:

   variable  := expression ;

   variable 是一个PL/SQL变量, expression 是一个PL/SQL 表达式.

 

 

NOT NULL  可选,表示给变量强制地加约束条件,此时变量必须初始化。

 

DECLAREv_i NUMBER;BEGIN FOR v_i IN 1..18 LOOP  dbms_output.put_line(v_i); END LOOP;END;

             Y:=X;

2.9   简单例子

 

num1=num2

2.5.2  一般运算符

 

运算符

意义

+

加号

减号

*

乘号

/

除号

:=

赋值号

=>

关系号

..

范围运算符

||

字符连接符

 

–使用ROWTYPE装载一行记录

取反的逻辑值

2.5.3  逻辑运算符

 

运算符

意义

IS NULL

是空值 

BETWEEN  AND

介于两者之间

IN

在一列值中间 

AND

逻辑与

OR

逻辑或

NOT

取返,如IS NOT NULL, NOT IN

 

–关系运算符>,<,>=,<=,=,!=,<>

  DBMS_OUTPUT.PUT_LINE(‘姓名:’||EMP_SOURCE.ENAME);

 

 

RUZHISHIJIAN EMP.HIREDATE%TYPE;

3.1  条件语句

 –date数据

EXCEPTION

END IF;

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

–查询EMP表的工资,输入员工编号,根据编号查询工资,如果工资高于3000,则显示高工资

       UPDATE emp SET sal=sal*1.1

介绍PL/SQL的流程控制语句, 包括如下三类:

异常处理部分

EXECUTABLE STATEMENTS

2.4.2.1 记录类型

记录类型类似于C语言中的结构数据类型,它把逻辑相关的、分离的、基本数据类型的变量组成一个整体存储起来,它必须包括至少一个标量型或RECORD数据类型的成员,称作PL/SQL
RECORD 的域(FIELD),其作用是存放互不相同但逻辑相关的信息。在使用记录数据类型变量时,需要先在声明部分先定义记录的组成、记录的变量,然后在执行部分引用该记录变量本身或其中的成员。

 

定义记录类型语法如下:

 

TYPE record_name IS RECORD(
   v1 data_type1  [NOT NULL]  [:= default_value ],
   v2 data_type2  [NOT NULL]  [:= default_value ],
   ……
   vn data_typen  [NOT NULL]  [:= default_value ] );

 

例4 :

 

永利官网ylg客户端 21
 
DECLARE 
   TYPE test_rec IS RECORD(
         Name VARCHAR2(30) NOT NULL := ‘胡勇’,
         Info VARCHAR2(100));
   rec_book test_rec;
BEGIN
   rec_book.Name :=’胡勇’;
   rec_book.Info :=’谈PL/SQL编程;’;
   DBMS_OUTPUT.PUT_LINE(rec_book.Name||’  ‘ ||rec_book.Info);
END;
 
永利官网ylg客户端 22

 

可以用 SELECT语句对记录变量进行赋值,只要保证记录字段与查询结果列表中的字段相配即可。

 

例5 :

 

 

永利官网ylg客户端 23
 
DECLARE
–定义与hr.employees表中的这几个列相同的记录数据类型
   TYPE RECORD_TYPE_EMPLOYEES IS RECORD(
        f_name   hr.employees.first_name%TYPE,
        h_date   hr.employees.hire_date%TYPE,
        j_id     hr.employees.job_id%TYPE);
–声明一个该记录数据类型的记录变量
   v_emp_record RECORD_TYPE_EMPLOYEES;BEGIN
   SELECT first_name, hire_date, job_id INTO v_emp_record
   FROM employees
   WHERE employee_id = &emp_id;   DBMS_OUTPUT.PUT_LINE(‘雇员名称:’||v_emp_record.f_name
             ||’  雇佣日期:’||v_emp_record.h_date
             ||’  岗位:’||v_emp_record.j_id);
END;
 
永利官网ylg客户端 24

 

一个记录类型的变量只能保存从数据库中查询出的一行记录,若查询出了多行记录,就会出现错误。

 

DECLARE v_flag1     BOOLEAN:=TRUE; v_flag2     BOOLEAN:=FALSE; v_flag3     BOOLEAN;BEGIN IF v_flag1 AND (NOT v_flag2) THEN  dbms_output.put_line('v_flage1 AND (NOT v_flag2)=TRUE');  END IF;  IF v_flag1 OR v_flag3 THEN  dbms_output.put_line('v_flage1 OR v_flag3=TRUE');  END IF;  IF v_flag1 AND v_flag3 IS NULL THEN  dbms_output.put_line('v_flage1 AND v_flag3 的结果为NULL');  END IF;END;/

动态SQL是指在运行时动态形成的SQL语句。如果需要在PL/SQL中执行DDL语句(如CREATE、ALTER、DROP)、DCL语句(GRANT、REVOKE),或者在PL/SQL块中需要执行更加灵活的SQL语句(如在SELECT语句中使用不同的WHERE条件),那么就必须借助于动态SQL。


 

静态SQL

3.4  标号和GOTO

–BINARY_INTEGER与
PLS_INTEGER具有相同的范围长度,与NUMBER相比较其所占用的范围更小,

EXCEPTION

 

DECLAREv_deptROW      dept%ROWTYPE ;   ---装载一行的dept记录BEGIN SELECT * INTO v_deptRow FROM dept WHERE deptno=10; dbms_output.put_line('部门编号'||v_deptRow.deptno||' 部门名称:'||v_deptRow.dname||' 部门位置'||v_deptRow.loc);END;/

  SELECT  E.EMPNO,E.ENAME,E.JOB,(SELECT ENAME FROM EMP WHERE EMPNO=E.MGR
),

2.4.2.2 数组类型

数据是具有相同数据类型的一组成员的集合。每个成员都有一个唯一的下标,它取决于成员在数组中的位置。在PL/SQL中,数组数据类型是VARRAY。

 

定义VARRY数据类型语法如下:

 

TYPE varray_name IS VARRAY(size) OF element_type [NOT NULL];

 

varray_name是VARRAY数据类型的名称,size是下整数,表示可容纳的成员的最大数量,每个成员的数据类型是element_type。默认成员可以取空值,否则需要使用NOT
NULL加以限制。对于VARRAY数据类型来说,必须经过三个步骤,分别是:定义、声明、初始化。

 

例6 :

 

 

 

永利官网ylg客户端 25
 
DECLARE
–定义一个最多保存5个VARCHAR(25)数据类型成员的VARRAY数据类型
   TYPE reg_varray_type IS VARRAY(5) OF VARCHAR(25);
–声明一个该VARRAY数据类型的变量
   v_reg_varray REG_VARRAY_TYPE;BEGIN
–用构造函数语法赋予初值
   v_reg_varray := reg_varray_type
         (‘中国’, ‘美国’, ‘英国’, ‘日本’, ‘法国’);   DBMS_OUTPUT.PUT_LINE(‘地区名称:’||v_reg_varray(1)||’、’
                                    ||v_reg_varray(2)||’、’
                                    ||v_reg_varray(3)||’、’
                                    ||v_reg_varray(4));
   DBMS_OUTPUT.PUT_LINE(‘赋予初值NULL的第5个成员的值:’||v_reg_varray(5));
–用构造函数语法赋予初值后就可以这样对成员赋值
   v_reg_varray(5) := ‘法国’;
   DBMS_OUTPUT.PUT_LINE(‘第5个成员的值:’||v_reg_varray(5));
END;
 
永利官网ylg客户端 26

 

 

BEGIN

l 顺序语句: GOTO语句, NULL语句

 

+、-

3.5  NULL 语句

DECLARE

DECLARE

2.8   注释

    在PL/SQL里,可以使用两种符号来写注释,即:

l       使用双 ‘-‘ ( 减号) 加注释

PL/SQL允许用 – 来写注释,它的作用范围是只能在一行有效。如:

    V_Sal  NUMBER(12,2); — 人员的工资变量。

* *

l         使用 /*   */  来加一行或多行注释,如:

/**********************************************/*

/ 文件名: department_salary.sql      */*

/ 作 者: EricHu                     */*

/ 时 间: 2011-5-9                  */*

/**********************************************/*

* *

提示:被解释后存放在数据库中的 PL/SQL 程序,一般系统自动将程序头部的注释去掉。只有在 PROCEDURE 之后的注释才被保留;另外程序中的空行也自动被去掉。

 

END;

3.3  循环

BEGIN

DECLARE

3.5  NULL 语句 

在PL/SQL 程序中,NULL语句是一个可执行语句,可以用 null 语句来说明“不用做任何事情”的意思,相当于一个占位符或不执行任何操作的空语句,可以使某些语句变得有意义,提高程序的可读性,保证其他语句结构的完整性和正确性。如:

例14:

 

永利官网ylg客户端 27
永利官网ylg客户端 28
DECLARE
    …
BEGIN
    …
    IF v_num IS NULL THEN
    GOTO labelPrint;
    END IF;
  …
  <<labelPrint>>
  NULL; –不需要处理任何数据。
END;
永利官网ylg客户端 29
永利官网ylg客户端 30

 

 

例15:

 

永利官网ylg客户端 31
永利官网ylg客户端 32
DECLARE
   v_emp_id employees.employee_id%TYPE;
   v_first_name employees.first_name%TYPE;
   v_salary employees.salary%TYPE;
   v_sal_raise NUMBER(3,2);
BEGIN
   v_emp_id := &emp_id;
   SELECT first_name, salary INTO v_first_name, v_salary
   FROM employees WHERE employee_id = v_emp_id;
   IF v_salary <= 3000 THEN
      v_sal_raise := .10;
      DBMS_OUTPUT.PUT_LINE(v_first_name||’的工资是’||v_salary
                                       ||’、工资涨幅是’||v_sal_raise);
   ELSE
      NULL;
   END IF;
END;
永利官网ylg客户端 33
永利官网ylg客户端 34
 

本篇主要内容如下:

2.1   PL/SQL块

2.2   PL/SQL结构

2.3   标识符

2.4   PL/SQL 变量类型

2.4.1  变量类型

2.4.2  复合类型

2.4.2.1 记录类型

2.4.2.2 数组类型

2.4.2.3 使用%TYPE

2.4.3  使用%ROWTYPE

2.4.4  LOB类型

2.4.5  BIND 变量

2.4.6  PL/SQL 表(TABLE)

2.5   运算符和表达式(数据定义)

2.5.1  关系运算符

2.5.2  一般运算符

2.5.3  逻辑运算符

2.6   变量赋值

2.6.1  字符及数字运算特点

2.6.2  BOOLEAN 赋值

2.6.3  数据库赋值

2.6.4  可转换的类型赋值

2.7   变量作用范围及可见性

2.8   注释

2.9   简单例子

2.9.1   简单数据插入例子

2.9.2   简单数据删除例子

 


 

–关系运算符

           END;

 

程序执行部分,

         ELSE DBMS_OUTPUT.PUT_LINE(‘此部门编号不存在’);

3.2  CASE 表达式

 

永利官网ylg客户端 35
永利官网ylg客户端 36
———格式一———
CASE 条件表达式
  WHEN 条件表达式结果1 THEN 
     语句段1
  WHEN 条件表达式结果2 THEN
     语句段2
  ……
  WHEN 条件表达式结果n THEN
     语句段n
  [ELSE 条件表达式结果]
END;
———格式二———
CASE 
  WHEN 条件表达式1 THEN
     语句段1
  WHEN 条件表达式2 THEN
     语句段2
  ……
  WHEN 条件表达式n THEN 
     语句段n
  [ELSE 语句段]
END;
永利官网ylg客户端 37
永利官网ylg客户端 38

 

 

例4:

 

永利官网ylg客户端 39
永利官网ylg客户端 40
DECLARE
  V_grade char(1) := UPPER(‘&p_grade’);
  V_appraisal VARCHAR2(20);
BEGIN
  V_appraisal :=
  CASE v_grade
    WHEN ‘A’ THEN ‘Excellent’
    WHEN ‘B’ THEN ‘Very Good’
    WHEN ‘C’ THEN ‘Good’
    ELSE ‘No such grade’
  END;
  DBMS_OUTPUT.PUT_LINE(‘Grade:’||v_grade||’  Appraisal: ‘|| v_appraisal);
END;
永利官网ylg客户端 41
永利官网ylg客户端 42

 

 

例5:

 

永利官网ylg客户端 43
永利官网ylg客户端 44
DECLARE
   v_first_name employees.first_name%TYPE;
   v_job_id employees.job_id%TYPE;
   v_salary employees.salary%TYPE;
   v_sal_raise NUMBER(3,2);
BEGIN
   SELECT first_name,   job_id,   salary INTO
          v_first_name, v_job_id, v_salary
   FROM employees WHERE employee_id = &emp_id;
   CASE
      WHEN v_job_id = ‘PU_CLERK’ THEN
         IF v_salary < 3000 THEN v_sal_raise := .08;
         ELSE v_sal_raise := .07;
         END IF;
      WHEN v_job_id = ‘SH_CLERK’ THEN
         IF v_salary < 4000 THEN v_sal_raise := .06;
         ELSE v_sal_raise := .05;
         END IF;
      WHEN v_job_id = ‘ST_CLERK’ THEN
         IF v_salary < 3500 THEN v_sal_raise := .04;
         ELSE v_sal_raise := .03;
         END IF;
      ELSE
         DBMS_OUTPUT.PUT_LINE(‘该岗位不涨工资: ‘||v_job_id);
   END CASE;
   DBMS_OUTPUT.PUT_LINE(v_first_name||’的岗位是’||v_job_id
                                    ||’、的工资是’||v_salary
                                    ||’、工资涨幅是’||v_sal_raise);
END;
永利官网ylg客户端 45
永利官网ylg客户端 46

 

 

 

 

DECLARE v_info_char     CHAR(10); v_info_varchar    VARCHAR2(10); BEGIN  v_info_char:='bdqn';  v_info_varchar:='java';  dbms_output.put_line('v_info_char内容长度:'||LENGTH(v_info_char));  dbms_output.put_line('v_info_varchar内容长度:'||LENGTH(v_info_varchar)); END;

while循环:将条件与一系列语句结合在一起,根据条件执行语句,此系列语句包含在关键字loop和end
loop之中。

2.6.2  BOOLEAN 赋值

 

布尔值只有TRUE, FALSE及 NULL 三个值。如:

 

永利官网ylg客户端 47
 
DECLARE
  bDone BOOLEAN;
BEGIN
  bDone := FALSE;
  WHILE NOT bDone LOOP
  Null;
  END LOOP;
END;
 
永利官网ylg客户端 48

 

–逻辑运算符   AND RO NOT

       WHERE empno=’7902′;

2.4   PL/SQL 变量类型

在前面的介绍中,有系统的数据类型,也可以自定义数据类型。下表给出ORACLE类型和PL/SQL中的变量类型的合法使用列表:

 

DECLARE

                 DBMS_OUTPUT.PUT_LINE(VAR_NAME);

 

 

BEGIN

3.4  标号和GOTO 

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

 

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

 

 

注意,在以下地方使用是不合法的,编译时会出错误。

u 跳转到非执行语句前面。

u 跳转到子块中。

u 跳转到循环语句中。

u 跳转到条件语句中。

u 从异常处理部分跳转到执行。

u 从条件语句的一部分跳转到另一部分。

 

例12:

 

永利官网ylg客户端 49
永利官网ylg客户端 50
DECLARE
   V_counter NUMBER := 1;
BEGIN
   LOOP 
     DBMS_OUTPUT.PUT_LINE(‘V_counter的当前值为:’||V_counter);
     V_counter := v_counter + 1;
   IF v_counter > 10 THEN
       GOTO labelOffLOOP;
   END IF;
   END LOOP;
   <<labelOffLOOP>>
     DBMS_OUTPUT.PUT_LINE(‘V_counter的当前值为:’||V_counter);
END;
永利官网ylg客户端 51
永利官网ylg客户端 52

 

 

例13:

永利官网ylg客户端 53
永利官网ylg客户端 54
DECLARE
   v_i NUMBER := 0;
   v_s NUMBER := 0;
BEGIN
   <<label_1>>
   v_i := v_i + 1;
   IF v_i <= 1000 THEN
      v_s := v_s + v_i;
      GOTO label_1;
   END IF;
   DBMS_OUTPUT.PUT_LINE(v_s);
END;
永利官网ylg客户端 55
永利官网ylg客户端 56

 

                            UPDATE EMP SET SAL=SAL*1.1

3.2  CASE 表达式

EXECPTION

其他

2.4.1  变量类型

 

在ORACLE8i中可以使用的变量类型有:

类型

子类

说     明

范   围

ORACLE限制

CHAR

Character

String

Rowid

Nchar

定长字符串

 

 

民族语言字符集

0à32767

可选,确省=1

2000

VARCHAR2

Varchar, String

NVARCHAR2

可变字符串

民族语言字符集

0à32767

4000

4000

BINARY_INTEGER

 

带符号整数,为整数计算优化性能

 

 

NUMBER(p,s)

Dec

 

Double precision

Integer

Int

Numeric

Real

Small int

小数, NUMBER 的子类型

高精度实数

整数, NUMBER 的子类型

整数, NUMBER 的子类型

与NUMBER等价

与NUMBER等价

整数, 比 integer 小

 

 

LONG

 

变长字符串

0->2147483647

32,767字节

DATE

 

日期型

公元前4712年1月1日至公元后4712年12月31日

 

BOOLEAN

 

布尔型

TRUE, FALSE,NULL

不使用

ROWID

 

存放数据库行号

 

 

UROWID

 

通用行标识符,字符类型

 

 

 

 

 

 

 

 

例1. 插入一条记录并显示;

 

 

永利官网ylg客户端 57
 
DECLARE
   Row_id ROWID;
   info    VARCHAR2(40);
BEGIN
  INSERT INTO scott.dept VALUES (90, ‘财务室’, ‘海口’)
  RETURNING rowid, dname||’:’||to_char(deptno)||’:’||loc
  INTO row_id, info;
  DBMS_OUTPUT.PUT_LINE(‘ROWID:’||row_id);
  DBMS_OUTPUT.PUT_LINE(info);
END;
 
永利官网ylg客户端 58

 

其中:

RETURNING子句用于检索INSERT语句中所影响的数据行数,当INSERT语句使用VALUES 子句插入数据时,RETURNING 字句还可将列表达式、ROWID和REF值返回到输出变量中。在使用RETURNING 子句是应注意以下几点限制:

1.不能与DML语句和远程对象一起使用;

2.不能检索LONG 类型信息;

3.当通过视图向基表中插入数据时,只能与单基表视图一起使用。

 

例2. 修改一条记录并显示

 

 

永利官网ylg客户端 59
 
DECLARE
   Row_id ROWID;
   info   VARCHAR2(40);
BEGIN
  UPDATE dept SET deptno=100 WHERE DNAME=’财务室’
  RETURNING rowid, dname||’:’||to_char(deptno)||’:’||loc
  INTO row_id, info;
  DBMS_OUTPUT.PUT_LINE(‘ROWID:’||row_id);
  DBMS_OUTPUT.PUT_LINE(info);
END;
 
永利官网ylg客户端 60

 

其中:

RETURNING子句用于检索被修改行的信息。当UPDATE语句修改单行数据时,RETURNING 子句可以检索被修改行的ROWID和REF值,以及行中被修改列的列表达式,并可将他们存储到PL/SQL变量或复合变量中;当UPDATE语句修改多行数据时,RETURNING 子句可以将被修改行的ROWID和REF值,以及列表达式值返回到复合变量数组中。在UPDATE中使用RETURNING 子句的限制与INSERT语句中对RETURNING子句的限制相同。

 

例3. 删除一条记录并显示

 

 

永利官网ylg客户端 61
 
DECLARE
   Row_id ROWID;
   info   VARCHAR2(40);
BEGIN
  DELETE dept WHERE DNAME=’办公室’
  RETURNING rowid, dname||’:’||to_char(deptno)||’:’||loc
  INTO row_id, info;
  DBMS_OUTPUT.PUT_LINE(‘ROWID:’||row_id);
  DBMS_OUTPUT.PUT_LINE(info);
END;
 
永利官网ylg客户端 62

 

其中:

RETURNING子句用于检索被删除行的信息:当DELETE语句删除单行数据时,RETURNING 子句可以检索被删除行的ROWID和REF值,以及被删除列的列表达式,并可将他们存储到PL/SQL变量或复合变量中;当DELETE语句删除多行数据时,RETURNING 子句可以将被删除行的ROWID和REF值,以及列表达式值返回到复合变量数组中。在DELETE中使用RETURNING 子句的限制与INSERT语句中对RETURNING子句的限制相同。

 

 

    ELSE

3.3  循环

 1.  简单循环

 

  LOOP
      要执行的语句;
      EXIT WHEN <条件语句> –条件满足,退出循环语句
  END LOOP;

 

 

 

例 6.

 

永利官网ylg客户端 63
永利官网ylg客户端 64
DECLARE
    int NUMBER(2) :=0;
BEGIN
   LOOP
      int := int + 1;
      DBMS_OUTPUT.PUT_LINE(‘int 的当前值为:’||int);
      EXIT WHEN int =10;
   END LOOP;
END;
永利官网ylg客户端 65
永利官网ylg客户端 66

 

 

2.  WHILE 循环

WHILE <布尔表达式> LOOP
    要执行的语句;
END LOOP;

 

 

 

 

例7.

 

 

永利官网ylg客户端 67
永利官网ylg客户端 68
DECLARE 
  x NUMBER :=1;
BEGIN
   WHILE x<=10 LOOP
      DBMS_OUTPUT.PUT_LINE(‘X的当前值为:’||x);
       x:= x+1;
   END LOOP;
END;
永利官网ylg客户端 69
永利官网ylg客户端 70

 

 

3.  数字式循环

 

 

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

 

 

每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1。跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT 退出循环。

 

例8.

 

 

BEGIN
   FOR int  in 1..10 LOOP
       DBMS_OUTPUT.PUT_LINE(‘int 的当前值为: ‘||int);
   END LOOP;
END;

 

 

例 9.

 

永利官网ylg客户端 71
永利官网ylg客户端 72
CREATE TABLE temp_table(num_col NUMBER);DECLARE
    V_counter NUMBER := 10;
BEGIN
   INSERT INTO temp_table(num_col) VALUES (v_counter );
   FOR v_counter IN 20 .. 25 LOOP
      INSERT INTO temp_table (num_col ) VALUES ( v_counter );
   END LOOP;
   INSERT INTO temp_table(num_col) VALUES (v_counter );
   FOR v_counter IN REVERSE 20 .. 25 LOOP
      INSERT INTO temp_table (num_col ) VALUES ( v_counter );
   END LOOP;
END ;DROP TABLE temp_table;
永利官网ylg客户端 73
永利官网ylg客户端 74

 

 

例10:

 

永利官网ylg客户端 75
永利官网ylg客户端 76
DECLARE
   TYPE jobids_varray IS VARRAY(12) OF VARCHAR2(10); –定义一个VARRAY数据类型
   v_jobids JOBIDS_VARRAY; –声明一个具有JOBIDS_VARRAY数据类型的变量
   v_howmany NUMBER; –声明一个变量来保存雇员的数量BEGIN
   –用某些job_id值初始化数组
   v_jobids := jobids_varray(‘FI_ACCOUNT’, ‘FI_MGR’, ‘ST_CLERK’, ‘ST_MAN’);   –用FOR…LOOP…END LOOP循环使用每个数组成员的值
   FOR i IN v_jobids.FIRST..v_jobids.LAST LOOP   –针对数组中的每个岗位,决定该岗位的雇员的数量
      SELECT count(*) INTO v_howmany FROM employees WHERE job_id = v_jobids(i);
      DBMS_OUTPUT.PUT_LINE ( ‘岗位’||v_jobids(i)||
                       ‘总共有’|| TO_CHAR(v_howmany) || ‘个雇员’);
   END LOOP;
END;
永利官网ylg客户端 77
永利官网ylg客户端 78

 

 

例11 在While循环中嵌套loop循环

永利官网ylg客户端 79
永利官网ylg客户端 80
/*求100至110之间的素数*/
DECLARE
   v_m NUMBER := 101;
   v_i NUMBER;
   v_n NUMBER := 0;
BEGIN
   WHILE v_m < 110 LOOP
      v_i := 2;
      LOOP
         IF mod(v_m, v_i) = 0 THEN
            v_i := 0;
            EXIT;
         END IF;
    
         v_i := v_i + 1;
         EXIT WHEN v_i > v_m – 1; 
      END LOOP;
      
      IF v_i > 0 THEN
         v_n := v_n + 1;
         DBMS_OUTPUT.PUT_LINE(‘第’|| v_n || ‘个素数是’ || v_m);
      END IF;      v_m := v_m + 2;
   END LOOP;
END;
永利官网ylg客户端 81
永利官网ylg客户端 82

1 第一个PL/SQL的程序

如果num1等于num2,则返回true

END IF;

IF <布尔表达式> THEN
  PL/SQL 和 SQL语句
ELSIF < 其它布尔表达式> THEN
  其它语句
ELSIF < 其它布尔表达式> THEN
  其它语句
ELSE
  其它语句
END IF;
永利官网ylg客户端 83
永利官网ylg客户端 84

 

 

提示: ELSIF 不能写成 ELSEIF

 

例1:

 

永利官网ylg客户端 85
永利官网ylg客户端 86
DECLARE
    v_empno  employees.employee_id%TYPE :=&empno;
    V_salary employees.salary%TYPE;
    V_comment VARCHAR2(35);
BEGIN
   SELECT salary INTO v_salary FROM employees 
   WHERE employee_id = v_empno;
   IF v_salary < 1500 THEN
       V_comment:= ‘太少了,加点吧~!’;
   ELSIF v_salary <3000 THEN
      V_comment:= ‘多了点,少点吧~!’;
   ELSE
      V_comment:= ‘没有薪水~!’;
   END IF;
   DBMS_OUTPUT.PUT_LINE(V_comment);
   exception
     when no_data_found then
        DBMS_OUTPUT.PUT_LINE(‘没有数据~!’);
     when others then
        DBMS_OUTPUT.PUT_LINE(sqlcode || ‘—‘ || sqlerrm);        
END;
永利官网ylg客户端 87
永利官网ylg客户端 88

 

 

例2:

 

永利官网ylg客户端 89
永利官网ylg客户端 90
DECLARE
   v_first_name  VARCHAR2(20);
   v_salary NUMBER(7,2);
BEGIN
   SELECT first_name, salary INTO v_first_name, v_salary FROM employees
   WHERE employee_id = &emp_id;
   DBMS_OUTPUT.PUT_LINE(v_first_name||’雇员的工资是’||v_salary);
   IF v_salary < 10000 THEN
      DBMS_OUTPUT.PUT_LINE(‘工资低于10000’);
   ELSE
      IF 10000 <= v_salary AND v_salary < 20000 THEN
         DBMS_OUTPUT.PUT_LINE(‘工资在10000到20000之间’);
      ELSE
         DBMS_OUTPUT.PUT_LINE(‘工资高于20000’);
      END IF;
   END IF;
END;
永利官网ylg客户端 91
永利官网ylg客户端 92

 

 

例3:

永利官网ylg客户端 93
永利官网ylg客户端 94
DECLARE
   v_first_name  VARCHAR2(20);
   v_hire_date DATE;
   v_bonus NUMBER(6,2);
BEGIN
   SELECT first_name, hire_date INTO v_first_name, v_hire_date FROM employees
   WHERE employee_id = &emp_id;
   IF v_hire_date > TO_DATE(’01-1月-90′) THEN
      v_bonus := 800;
   ELSIF v_hire_date > TO_DATE(’01-1月-88′) THEN
      v_bonus := 1600;
   ELSE
      v_bonus := 2400;
   END IF;
   DBMS_OUTPUT.PUT_LINE(v_first_name||’雇员的雇佣日期是’||v_hire_date
                                    ||’、奖金是’||v_bonus);
END;
永利官网ylg客户端 95
永利官网ylg客户端 96

 

 

                   DBMS_OUTPUT.PUT_LINE(‘该编号的员工不存在!’);

2.3   标识符

PL/SQL程序设计中的标识符定义与SQL 的标识符定义的要求相同。要求和限制有:

l       标识符名不能超过30字符;

l       第一个字符必须为字母;

l       不分大小写;

l       不能用’-‘(减号);

l       不能是SQL保留字。

*提示:  一般不要把变量名声明与表中字段名完全一样,如果这样可能得到不正确的结果.***

 

例如:下面的例子将会删除所有的纪录,而不是’EricHu’的记录;

 

DECLARE
   ename varchar2(20) :=’EricHu’;
BEGIN
  DELETE FROM scott.emp WHERE ename=ename;
END;

 

    变量命名在PL/SQL中有特别的讲究,建议在系统的设计阶段就要求所有编程人员共同遵守一定的要求,使得整个系统的文档在规范上达到要求。下面是建议的命名方法:

 

标识符

命名规则

例子

程序变量

V_name

V_name

程序常量

C_Name

C_company_name

游标变量

Cursor_Name

Cursor_Emp

异常标识

E_name

E_too_many

表类型

Name_table_type

Emp_record_type

Name_table

Emp

记录类型

Name_record

Emp_record

SQL*Plus 替代变量

P_name

P_sal

绑定变量

G_name

G_year_sal

 

声明部分

–FOR循环

2.7   变量作用范围及可见性

在PL/SQL编程中,如果在变量的定义上没有做到统一的话,可能会隐藏一些危险的错误,这样的原因主要是变量的作用范围所致。变量的作用域是指变量的有效作用范围,与其它高级语言类似,PL/SQL的变量作用范围特点是:

l       变量的作用范围是在你所引用的程序单元(块、子程序、包)内。即从声明变量开始到该块的结束。

l       一个变量(标识)只能在你所引用的块内是可见的。

l       当一个变量超出了作用范围,PL/SQL引擎就释放用来存放该变量的空间(因为它可能不用了)。

l       在子块中重新定义该变量后,它的作用仅在该块内。

 

例15:

 

 

永利官网ylg客户端 97
 
DECLARE
   Emess char(80);
BEGIN   DECLARE
      V1 NUMBER(4);
   BEGIN
      SELECT empno INTO v1 FROM emp WHERE LOWER(job)=’president’;
      DBMS_OUTPUT.PUT_LINE(V1);
   EXCEPTION
      When TOO_MANY_ROWS THEN
         DBMS_OUTPUT.PUT_LINE (‘More than one president’);
   END;   DECLARE 
      V1 NUMBER(4);
   BEGIN
      SELECT empno INTO v1 FROM emp WHERE LOWER(job)=’manager’;
   EXCEPTION
      When TOO_MANY_ROWS THEN
          DBMS_OUTPUT.PUT_LINE (‘More than one manager’);
   END;EXCEPTION
   When others THEN
      Emess:=substr(SQLERRM,1,80);
      DBMS_OUTPUT.PUT_LINE(emess);
END;
 
永利官网ylg客户端 98

 

DECLAREv_info VARCHAR2(50):='欢迎使用Oracle数据库';vurl  VARCHAR2(50);BEGIN vurl :='www.163.com'; dbms_output.put_line(v_info); dbms_output.put_line(v_url);END;/

                  
ERROR_NUMBER:是用户为异常指定的编号,该编号必须介于-20000~-20999之间

2.4.2  复合类型

    ORACLE 在 PL/SQL 中除了提供象前面介绍的各种类型外,还提供一种称为复合类型的类型—记录和表.

 

END;

END;

2.9.1   简单数据插入例子

 

例16:

 

 

永利官网ylg客户端 99
 
/***********************************************/
/* 文件名: test.sql                  */
/* 说 明:
       一个简单的插入测试,无实际应用。*/
/* 作 者: EricHu                     */
/* 时 间: 2011-5-9                  */
/***********************************************/
DECLARE
  v_ename   VARCHAR2(20) := ‘Bill’;
  v_sal       NUMBER(7,2) :=1234.56;
  v_deptno   NUMBER(2) := 10;
  v_empno   NUMBER(4) := 8888;
BEGIN
  INSERT INTO emp ( empno, ename, JOB, sal, deptno , hiredate )  
  VALUES (v_empno, v_ename, ‘Manager’, v_sal, v_deptno, 
            TO_DATE(‘1954.06.09′,’yyyy.mm.dd’) );
  COMMIT;
END;
 
永利官网ylg客户端 100

 

 

2.9.2   简单数据删除例子

例17:

 

 

 

永利官网ylg客户端 101
 
/***********************************************/
/* 文件名: test_deletedata.sql      */
/* 说 明:
       简单的删除例子,不是实际应用。 */
/* 作 者: EricHu                     */
/* 时 间: 2011-5-9                  */
/***********************************************/
DECLARE
  v_ename   VARCHAR2(20) := ‘Bill’;
  v_sal       NUMBER(7,2) :=1234.56;
  v_deptno   NUMBER(2) := 10;
  v_empno   NUMBER(4) := 8888;
BEGIN
  INSERT INTO emp ( empno, ename, JOB, sal, deptno , hiredate )  
VALUES ( v_empno, v_ename, ‘Manager’, v_sal, v_deptno, 
TO_DATE(’1954.06.09’,’yyyy.mm.dd’) );
  COMMIT;
END;
 DECLARE
  v_empno   number(4) := 8888;
BEGIN
  DELETE FROM emp WHERE empno=v_empno;
  COMMIT;
END;
 
永利官网ylg客户端 102

 

                  WHEN 20 THEN
DBMS_OUTPUT.PUT_LINE(‘RESEARCH’);

l 循环语句: LOOP语句, EXIT语句

–在数学计算时,NUMBER保存为十进制,需要先转换为二进制后才可以说进行计算,

例2

–循环控制

XINGMING EMP.ENAME%TYPE;

声明部分

–查询视图

–用户输入 一个员工编号,根据它所在的部门给上涨工资

              
RAISE_APPLICATION_ERROR(-20001,’此编号员工不存在!’);

 

BEGIN

DECLAREv_pls1   PLS_INTEGER:=100;v_pls2   PLS_INTEGER:=200;v_result  PLS_INTEGER;BEGIN v_result:=v_pls1+v_pls2; dbms_output.put_line('计算结果:'||v_result); END; 

动态SQL:

 

  DBMS_OUTPUT.PUT_LINE(‘工资:’||GONGZI);

DECLAREv_i NUMBER;BEGIN FOR v_i IN 1..10 LOOP  IF v_i=6 THEN   EXIT;   END IF;   dbms_output.put_line(v_i); END LOOP;END;

CONSTANT
可选,表示常量。VALUE在声明时必须初始化。且常量的值在程序内部不能改变。

 

如果num1大于等于num2,则返回true

DECLARE  v_resultA NUMBER NOT NULL; --只声明变量没有内容  BEGIN   dbms_output.put_line('v_resultA:'||v_resultA );END;/

算术运算符

–使用REVERSE递减

 

DECLAREv_i NUMBER;BEGIN FOR v_i IN REVERSE 1..18 LOOP  dbms_output.put_line(v_i); END LOOP;END;

             X:=X-10;

 

                VAR_SCORE NUMBER;

–日期型

RAISE_APPLICATION_ERROR 过程: 用于创建用户定义的错误信息,
可以在可执行部分和异常处理部分使用

–使用EXIT退出

                   ELSE   ——–关键字ELSE后面不能加THEN条件语句

DECLARE  v_resultA NUMBER NOT NULL:=100; --只声明变量没有内容BEGIN  dbms_output.put_line('v_resultA:'||v_resultA );END;/

1、
声明部分:声明部分包含了块中使用的变量、游标、自定义异常,由关键字DECLARE开始。如果不需要声明变量或常量,可以忽略这部分。

–但是–BINARY_INTEGER与 PLS_INTEGER还是有区别的

           THEN DBMS_OUTPUT.PUT_LINE(‘优秀’);

 

匿名PL/SQL

DECLAREBEGIN DBMS_OUTPUT.PUT_LINE('Hello World!');END;/

  DBMS_OUTPUT.PUT_LINE(‘工种:’||GONGZUO);

 

num1<num2

—for 循环

                            WHEN NO_DATA_FOUND THEN

 

DECLARE

DECLARE  v_result     VARCHAR2(30); --只声明变量没有内容BEGIN  dbms_output.put_line('v_result的内容:'||v_result );END;/

         sql_string VARCHAR2(200);

–还可以使用%ROWTYPE 标记定义表中一行的记录类型

例1:

 

                            SELECT empno,empname INTO
empno,empname FROM emp WHERE empno=’8888′;

–变量的声明与赋值%type和%rowtype的使用

语法:loop

DECLARE V_ENO   EMP.EMPNO%TYPE; V_EMPSAL EMP.SAL%TYPE; V_EMPNAME EMP.ENAME%TYPE;BEGIN V_ENO := &EMPNO; SELECT ENAME, SAL INTO V_EMPNAME, V_EMPSAL FROM EMP WHERE EMPNO = V_ENO; IF V_EMPSAL > 3000 THEN  DBMS_OUTPUT.PUT_LINE(V_EMPNAME || '工资是高工资'); ELSIF V_EMPSAL > 2000 THEN  DBMS_OUTPUT.PUT_LINE(V_EMPNAME || '工资是中等工资'); ELSE  DBMS_OUTPUT.PUT_LINE(V_EMPNAME || '工资是低工资'); END IF;END;

  DBMS_OUTPUT.PUT_LINE(‘员工编号:’||EMP_SOURCE.EMPNO);

 DECLARE v_info_char     NCHAR(10); v_info_varchar    NVARCHAR2(10); BEGIN  v_info_char:='bdqn';  v_info_varchar:='java';  dbms_output.put_line('v_info_char内容长度:'||LENGTH(v_info_char));  dbms_output.put_line('v_info_varchar内容长度:'||LENGTH(v_info_varchar)); END;

         empno emp.empno%type;

DECLARE  v_countResult    NUMBER; BEGIN  SELECT COUNT(*) INTO v_countResult FROM emp;  IF v_countResult>10 THEN   dbms_output.put_line('EMP表记录大于10条');   END IF; END;

>=

DECLAREv_i NUMBER:=1;BEGIN LOOP  dbms_output.put_line(v_i);  v_i:=v_i+1;  EXIT WHEN v_i>8; END LOOP;END;

PL/SQL支持的内置数据类型:

–范围查询 BETWEEN 最小值 AND最大值

  X NUMBER:=1000;

–范围查询 IN

  DBMS_OUTPUT.PUT_LINE(‘员工编号:’||BIANHAO);

–定义非空

seq_of_statements;

DECLARE v_eno NUMBER:=&ID; v_ename VARCHAR2(20);BEGIN  SELECT ename INTO v_ename  FROM emp  WHERE empno=v_eno;  dbms_output.put_line('编号为:'||v_eno||' 员工姓名:'||v_ename);END;/

       END LOOP;

–常量不能改变

  DBMS_OUTPUT.PUT_LINE(‘领导:’||EMP_SOURCE.MGR);

DECLARE v_eno      emp.empno%TYPE;  --与empno类型相同  v_ename      emp.ename%TYPE;  --与ename类型相同BEGIN dbms_output.put_line('请输入员工编号:'); v_eno:=&empno;             --由键盘输入员工编号 SELECT ename INTO v_ename FROM emp WHERE empno=v_eno; dbms_output.put_line('编号为:'||v_eno||'员工姓名: '||v_ename);END;/

CASE语句 用于根据单个变量或表达式与多个值进行比较

 

IF语句主要有3种形式:IF-THEN  IF-THEN-ELSE  IF-THEN-ELSIF

DECLARE  v_resultA  NUMBER:=100; --只声明变量没有内容  v_resultB  NUMBER;BEGIN v_resultB:=30;  dbms_output.put_line('加法'||(v_resultA+v_resultB) );END;/

语法:

–10部门上涨10%,20部门20%,30上涨30%

只要一个为真则结果为真

 

BEGIN

 

DECLARE

DECLARE  v_countResult    NUMBER; BEGIN  SELECT COUNT(*) INTO v_countResult FROM dept;  IF v_countResult>10 THEN   dbms_output.put_line('DEPT表记录大于10条');   ELSE    dbms_output.put_line('DEPT表记录小于10条');   END IF; END;

BEGIN

 

       UPDATE emp SET sal=sal*1.2

DECLARE  v_num NUMBER;BEGIN  v_num:=30;  dbms_output.put_line('v_num变量内容是:'||v_num);END;/ 

BIANHAO EMP.EMPNO%TYPE;

 

           SELECT ENAME INTO VAR_NAME FROM EMP WHERE EMPNO=’7902′;

–5加法

                        WHERE empno=’8888′;

 

       DBMS_OUTPUT.PUT_LINE(‘薪水上升10%’);

 

     CASE

 

–定义常量

TRUE OR FALSE

–2一个简单的PL/SQL程序

流程控制语句:条件控制、循环控制、顺序控制

 

名称

类型

说明

NUMBER

数字型

用于存储整数、定点数和浮点数,可以定义精度和取值范围

BINARY_INTEGER

数字型

用于存储带符号整数

INTEGER

数字型

NUMBER的子类型,用于声明高精度为38位的十进制整数

REAL

数字型

NUMBER的子类型,用于声明高精度为63位的二进制浮点数

FLOAT

数字型

NUMBER的子类型,用于声明高精度为126位的二进制浮点数

CHAR

字符型

用于存储固定长度字符,指定不超过32767个字节的长度

VARCHAR2

字符型

用于存储可变长度字符,指定不超过32767个字节的长度

DATE

日期型

用于存储日期和时间值

BOOLEAN

布尔型

用于存储逻辑值,TRUE、FALSE和NULL

BFILE

LOB类型

该数据类型用于将大型二进制对象存储在系统文件中,最大存储4GB

BLOB

LOB类型

该数据类型用于将大型二进制对象存储在数据库中,最大存储4GB

CLOB

LOB类型

该数据类型用于将大型字符数据存储在数据库中,最大存储4GB

NCLOB

LOB类型

该数据类型用于将大型NCHAR数据存储在数据库中,最大存储4GB

–使用contiune结束当次循环

             VOU:=VOU+1;

–判断NULL IS NULL ,IS NOT NULL

‘abc’||’def’

 

             DBMS_OUTPUT.PUT_LINE(‘查询返回不止一行’);

DECLARE v_url   VARCHAR2(50):='www.163.com'; v_num1   NUMBER:=80; v_num2   NUMBER:=30;BEGIN IF v_num1>v_num2 THEN  dbms_output.put_line('第一个数字比第二个数字大'); END IF; IF v_url LIKE '%163%' THEN  dbms_output.put_line('网址中包含163的字样'); END IF;END;/

示例:

—数值型

       WHEN VAR_SCORE BETWEEN 60 AND 69

DECLARE  v_resultA CONSTANT NUMBER NOT NULL:=100; --使用CONSTANT关键字定义常量BEGIN v_resultA:=20;  dbms_output.put_line('v_resultA:'||v_resultA );END;/

循环共分3种类型:loop循环:在loop和end
loop之间的一系列语句,为避免陷入无限循环,loop循环中必须使用exit和exit
when语句。

–要求最高不能超过5000元,起过5000元就停留在5000;

                                                                            立此存照

 

                            WHERE EMPNO=’7902’;

***********运算符*

             DBMS_OUTPUT.PUT_LINE(X);

 

(SELECT DNAME FROM DEPT WHERE E.DEPTNO=DEPT.DEPTNO) DNAME FROM EMP E;

 

DECLARE

发表评论

电子邮件地址不会被公开。 必填项已用*标注