Oracle PLSQL使用基础

介绍

PL是Procedural Language的缩写, 表示过程化编程语言

基本结构

PL/SQL主要包括DECLARE部分, BEGIN….END部分, 和EXCEPTION部分

  • DECLARE 用于声明变量. PL/SQL程序块中使用的变量一般都会在DECLARE中声明
  • BEGIN….END: 程序块中的主体部分. 其中, 还可以嵌套其他PL/SQL块
  • EXCEPTION: 用于处理PL/SQL块运行过程中可能出现的任何可执行错误
  • / : PL/SQL需要使用正斜杠结尾, 才能被执行
[DECLARE declaration_statments;]
BEGIN
	executable_statment;
[EXCEPTION ecception_handing_statment;]
END;
/

常亮和变量

Oracle 标识符规定

  • 名称必须以字母开头
  • 名称长度不能超过30个字符
  • 名称中不能包含减号和空格
  • 不能是SQL保留字
数据类型

除了可以使用与SQL相同的数据类型以外, Oracal还专门为了PL/SQL程序块提供了特定类型

数值数据类型

在这里插入图片描述

字符数据类型

在这里插入图片描述

布尔数据类型

在这里插入图片描述

日期和时间间隔数据类型

在这里插入图片描述

大对象数据类型

1559530781146

常量

声明常量时使用CONSTANT关键字, 并且必须在声明时就为该常量赋值,而且在程序其他部分不能修改该常量的值

constant_name CONSTANT data_type {:= |DEFAULT} value;
变量

声明变量时候不需要使用CONSTANT关键字, 而且可以不用为其赋初始, 其值可以在程序的其他部分被修改

variable_name data_type [ [NOT NULL ] {:= | DEFAULT} value];
示例

使用PL/SQL 程序块, 输出显示scott.emp表中的部分数据数据

SET SERVEROUTPUT ON -- 命令打开服务器输出
DECLARE
	emp_number CONSTANT NUMBER(4) := 7900;
	emp_name varchar2(10);
	emp_job varchar2(9);
	emp_sal number(7, 2);
BEGIN
	SELECT ename, job, sal INTO emp_name, emp_job, emp_sal -- select...into 语句可以为变量赋值
	FROM scott.emp WHERE empno =  emp_number;
	DBMS_OUTPUT.PUT_LINE('查询的员工编号为: ' || emp_number);  -- 控制台输出语句, || 用来连接字符串
	DBMS_OUTPUT.PUT_LINE('查询的员工姓名为: ' || emp_name);
	DBMS_OUTPUT.PUT_LINE('查询的员工职位为: ' || emp_job);
	DBMS_OUTPUT.PUT_LINE('查询的员工工资为: ' || emp_sal);
END; 
/
%TYPE类型和%ROWTYPE类型
  1. %TYPE类型

    PL/SQL 程序块中, 有时候会使用表中的数据为变量赋值, 例如示例中的emp_name 变量, 此时需要用户知道变量所对应的数据类型, 否则不能确定变量的数据类型, 此时使用%TYPE类型就可以解决这类问题

    %TYPE 用于隐式的将变量的数据类型指定为对应列的数据类型

    定义形式如下

    variable_name table_name.column_name%TYPE
    	[[NOT NULL] {:=|DEFAULT} value];
    

    修改上次示例, 使用%TYPE类型

    SET SERVEROUTPUT ON -- 命令打开服务器输出
    DECLARE
    	emp_number CONSTANT emp.empno%TYPE := 7900;
    	emp_name emp.ename%TYPE;
    	emp_job emp.job%TYPE;
    	emp_sal emp.sal%TYPE;
    BEGIN
    	SELECT ename, job, sal INTO emp_name, emp_job, emp_sal -- select...into 语句可以为变量赋值
    	FROM scott.emp WHERE empno =  emp_number;
    	DBMS_OUTPUT.PUT_LINE('查询的员工编号为: ' || emp_number);  -- 控制台输出语句, || 用来连接字符串
    	DBMS_OUTPUT.PUT_LINE('查询的员工姓名为: ' || emp_name);
    	DBMS_OUTPUT.PUT_LINE('查询的员工职位为: ' || emp_job);
    	DBMS_OUTPUT.PUT_LINE('查询的员工工资为: ' || emp_sal);
    END; 
    /
    
  2. %ROWTYPE 类型

    %TYPE 类型针对表中的某一列, %ROWTYPE针对一张表, 或一行

    定义形式如下

    variable_name table_name%ROWTYPE;
    

    修改上次示例, 使用%RWOTYPE类型

    SET SERVEROUTPUT ON -- 命令打开服务器输出
    DECLARE
    	emp_number CONSTANT emp.empno%TYPE := 7900;
    	one_emp emp%ROWTYPE
    BEGIN
    	SELECT * INTO ont_emp -- select...into 语句可以为变量赋值
    	FROM scott.emp WHERE empno =  emp_number;
    	DBMS_OUTPUT.PUT_LINE('查询的员工编号为: ' || emp_number);  -- 控制台输出语句, || 用来连接字符串
    	DBMS_OUTPUT.PUT_LINE('查询的员工姓名为: ' || one_emp.ename);
    	DBMS_OUTPUT.PUT_LINE('查询的员工职位为: ' || one_emp.job);
    	DBMS_OUTPUT.PUT_LINE('查询的员工工资为: ' || one_emp.sal);
    END; 
    /记录类型和表类型
    
积录类型和表类型

PL/SQL记录类型和表类型都是用户自定义的复合数据类型, 其中记录数据类型可以存储多个字段值, 类似于表中的一行数据; 表类型则可以存储多行数据.

  1. 记录类型

    记录类型与数据库中表的行结构非常相似, 使用记录类型定义的变量可以存储由一个或多个字段组成的一行数据

    创建记录类型需要用到TYPE语句, 语法如下

    TYPE record_name IS RECORD (
    	field_name data_type [ [not null] {:= : DEFAULT} value][, ....]
    );
    
    • record_name: 创建的记录类型名称
    • is RECORD:表示创建的是记录类型
    • field_name: 记录类型中的字段名

    在PL/SQL中创建一个记录类型, 然后使用该类型定义一个变量, 并赋值

    set serveroutput on
    declare
    	type emp_type is record (
        	empno number(4),
            ename varchar2(10),
            job varchar2(9),
            sal number(7, 2)
        );
        one_emp emp_type;
    begin
    	select empno, ename, job, dal
    	into one_emp
    	from scott.emp where empno=7900;
    	DBMS_OUTPUT.PUT_LINE('查询的员工编号为: ' || emp_number);  -- 控制台输出语句, || 用来连接字符串
    	DBMS_OUTPUT.PUT_LINE('查询的员工姓名为: ' || one_emp.ename);
    	DBMS_OUTPUT.PUT_LINE('查询的员工职位为: ' || one_emp.job);
    	DBMS_OUTPUT.PUT_LINE('查询的员工工资为: ' || one_emp.sal);
    end;
    /	
    
  2. 表类型

    使用记录类型只能保存一行数据, 这限制了select语句的返回行数, Oracle提供了一种自定义类型, 表类型, 可以接收多行数据. 类似于表.

    TYPE table_name is table of data_type [ not null ]
    index by binary_integer;
    
    • table_name: 创建的表的类型名称
    • IS TABLE: 表示创建的是表类型
    • data_type: 可以是任何合法的PL/SQL数据类型
    • INDEX by binary_integer: 指定系统创建一个主键索引, 用于引用表类型变量中的特定行.

    创建表类型

    set serveroutput on
    declare
    	type emp_type is table of emp%ROWTYPE
        index by BINARY_INTEGER;
        new_emp emp_type;
    begin
    	new_emp(1).empno := 6800;
    	new_emp(2).empno := 6900;
    	new_emp(1).ename := 'TRACY';
    end;
    /	
    

条件选择语句

IF语句

IF condition1 THEN
	statements1
[elseif condition2 then]
	statements2
[else
	statemtnts3]
end if;

在plsql中, 使用IF条件语句判断成绩61分所处的等级

set serveroutput on;
declare
	score BINARY_INTEGER := 61;
begin
	if score >= 90 then
		DBMS_OUTPUT.PUT_LINE('优秀');
	elseif score >= 80 then
		DBMS_OUTPUT.PUT_LINE('良好');
	elseif score >= 60 then
		DBMS_OUTPUT.PUT_LINE('及格');
	else
		DBMS_OUTPUT.PUT_LINE('不及格');
	end if;
end;
/

case 语句

  1. 简单case语句表达式

    case search_expression
    	when expression1 then result1;
    	when expression2 then result2;
    	...
    	[else default_result;]
    end case;
    

    使用简单的case语句判断’良好’所对应的分数阶段, 如下

    set serveroutput on
    declare
    	grade varchar2(4) := '良好';
    begin
    	 case grade
    	 when '优秀' then DBMS_OUTPUT.PUT_LINE('大于等于90分');
    	 when '良好' then DBMS_OUTPUT.PUT_LINE('大于等于80分');
    	 else DBMS_OUTPUT.PUT_LINE('小于60分');
    	 end case;
    end;
    /
    
  2. 搜索表达式

    搜索表达式使用条件来确定返回值

    case
    	when condition1 then result1;
    	when condition2 then result2;
    	when condition3 then result3;
    	...
    	[else default_result;]
    end case;
    

    与简单表达式相比, case关键字后不跟待求表达式, 而when子句中表达式也换了条件语句(condition)

    使用case语句判断处于61分以下的成绩

    SET SERVEROUTPUT ON
    declare
    	score binary_integer := 61;
    begin
    	case
    	when score >= 90 then DBMS_OUTPUT.PUT_LINE('优秀');
    	when score >= 80 then DBMS_OUTPUT.PUT_LINE('良好');
    	when score >= 60 then DBMS_OUTPUT.PUT_LINE('及格');
    	else DBMS_OUTPUT.PUT_LINE('不及格');
    	end case;
    end;
    /
    

循环语句

LOOP语句

使用和java的do…while语句差不多

LOOP 
	statements;
	[exit [when condition]];
end loop;

使用loop语句, 输出1到10

DEClARE
	i binary_integer := 1;
BEGIN
	LOOP
		DBMS_OUTPUT.PUT_LINE(i);
		i := i + 1;
		exit when i > 10;
	end loop;
end;
/

while循环语句

while语句是在loop语句的基础上添加循环条件

WHILE condition
LOOP
	statments;
end loop;

使用while输出1-10

declare
	i binary_integer := 1;
	while i < 10
	loop
		DBMS_OUTPUT.PUT_LINE(i);
		i := i + 1;
	end loop;
end;
/

for语句

for是在loop语句生添加循环次数

for loop_variable in [reverse] lower_bound .. upper_bound
loop
	statements;
end loop;

使用for语句输出

BEGIN
	for i in 1 .. 10
	LOOP
		DBMS_OUTPUT.PUT_LINE(i);
	end loop;
end;
/
  • 11
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值