暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PL/SQL 之 PL/SQL编程基础

晟数学院 2021-04-16
1092
 

点击“蓝字”关注我们

晟数学院DBA成长日记--PL/SQL篇

PL/SQL

    PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言。SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环)。而PL/SQL是结构化的和过程化的结合体,而且最为重要的是,在用户执行多条SQL语句时,每条SQL语句都是逐一的发送给数据库,而PL/SQL可以一次性将多条SQL语句一起发送给数据库。

    PL/SQL支持两种类型的程序,一种是匿名块程序,另一种是命名块程序。这两种程序都由声明、执行和异常处理3个部分组成。

PL/SQL语法结构

语法:

DECLARE

        -- 声明部分,例如:定义变量、常量、游标。

    BEGIN

        -- 程序编写、SQL语句

    EXECTPION

        -- 处理异常

    END ;

    /

说明:

  • 声明部分(DECLARE):包含变量定义、用户定义的PL/SQL类型、游标、引用的函数或过程;

  • 执行部分(BEGIN):包含变量赋值、对象初始化、条件结构、迭代结构、嵌套的PL/SQL匿名块,或是对局部或存储PL/SQL命名块的调用;

  • 异常部分(EXCEPTION):包含错误处理语句,该语句可以像执行部分一样使用所有项;

  • 结束部分(END):程序执行到END表示结束,分号用于结束匿名块,而正斜杠(/)执行块程序;

(1)PL/SQL —— 范例(执行块中至少有一条语句)

SCOTT@SDEDU> begin

2  null;

3  end;

4  /

(2)编写PL/SQL块,输入一个雇员编号,而后取得指定的雇员姓名

SCOTT@SDEDU> ed011101.sql

declare

v_eno number;

v_ename varchar2(10);

begin

v_eno:=&empno;

select ename into v_ename from emp where empno=v_eno;

dbms_output.put_line('number is'||v_eno||'name is'||v_ename);

end;

/

为什么没有显示结果?

因为在默认情况下,Oracle将输出显示关闭了,此时用户需要先输入set serveroutput on,就可以正常显示了。

(3)打开输出权限

SCOTT@SDEDU> set serveroutput on;

SCOTT@SDEDU> @011101.sql

Enter value for empno: 7369

old   5:  v_eno:=&empno;

new   5:  v_eno:=7369;

PL/SQL procedure successfully completed.

(4)编写一个简单的PL/SQL程序

SCOTT@SDEDU> ed011112.sql

declare

v_num number;    --定义一个变量v_num

begin

v_num:=30;         --给v_num赋值30

dbms_output.put_line('v_num is: '||v_num);

end;

/


SCOTT@SDEDU> @011112.sql

v_num is: 30

PL/SQL procedure successfully completed.

(5)编写PL/SQL块,输入一个雇员编号,而后取得指定的雇员姓名

SCOTT@SDEDU> ed11602.sql

declare

v_ename varchar2(10);

v_eno number;

begin

v_eno:=&empno;

select ename into v_ename from emp where empno=v_eno;

dbms_output.put_line('name is: '||v_ename||',number is: '||v_eno);

end;

/


SCOTT@SDEDU> @11602

Enter value for empno: 7369

old   5:  v_eno:=&empno;

new   5:  v_eno:=7369;

name is: SMITH,number is: 7369

PL/SQL procedure successfully completed.

总结:

PL/SQL可以同时向数据库执行多条语句;

PL/SQL可以进行变量的定义与程序语句的编写。

变量

PL/SQL是一种强类型的编程语言,所有的变量都必须在它声明之后才可以使用,变量都要求在DECLARE部分进行声明,而对于变量的名称也有如下的一些规定:

  • 变量名称的组成可以由字母、数字、_、$、#等组 成;

  • 所有的变量名称要求以字母开头,不能是Oracle中的 保留字(关键字);

  • 变量的长度最多只能为30个字符。

声明变量的语法

所有的变量都要求在DECLARE部分之中进行,在定义变量的时候也可以为其赋默认值,变量声明。

语法如下:

变量名称 [CONSTANT] 类型 [NOT NULL] [:=value] ;

组成:

CONSTANT:定义常量,必须在声明时为其赋予默认值;

NOT NULL:表示此变量不允许设置为NULL;

:=value:表示在变量声明时,设置好其初始化内容。

(6)定义变量

SCOTT@SDEDU> ed0111114.sql

declare

v_resultA number:=100; --定义变量并赋值

v_resultB number;

begin

v_resultb:=30;         --没有区分大小写

dbms_output.put_line('the result is: '||(v_resultA+v_resultB));

end;

/


SCOTT@SDEDU> @0111114.sql

the result is: 130

PL/SQL procedure successfully completed.

(7)定义非空变量

SCOTT@SDEDU> ed011100.sql

declare

v_resultA number not null:=100;

begin

dbms_output.put_line('v_resultA:'||(v_resultA));

end;

/


SCOTT@SDEDU> @011100.sql

v_resultA:100

PL/SQL procedure successfully completed.

(8)定义常量

SCOTT@SDEDU> ed0111115.sql

declare

v_resultA CONSTANT number not null:=100;       

    --定义一个常量并赋值,注意要大写

begin

dbms_output.put_line('resultA is: '||v_resultA);

end;

/


SCOTT@SDEDU> @0111115.sql

resultA is: 100

PL/SQL procedure successfully completed.

(9)算术运算

SCOTT@SDEDU> ed011103.sql

declare

v_resultA number:=10;

v_resultB number;

begin

v_resultB:=20;

dbms_output.put_line('result is: '||(v_resultA*v_resultB));

end;

/


SCOTT@SDEDU> @011103.sql

result is: 200

PL/SQL procedure successfully completed.

%TYPE声明变量类型

在编写PL/SQL程序的时候,如果希望某一个变量与指定数据表中某一列的类型一样,则可以采用“变量定义表名称.字段名称%TYPE”的格式,这样指定的变量就具备了与指定的字段相同的类型。

(10)使用“%TYPE”定义变量

SCOTT@SDEDU> ed011100.sql

declare

eno emp.empno%type;

ena emp.ename%type;

begin

dbms_output.put_line('please enter your number:');

eno:=&empno;

select ename into ena from emp where empno=eno;

dbms_output.put_line('number is '||eno||'name is '||ena);

end;

/

%ROWTYPE声明变量类型

使用“%ROWTYPE”标记可以定义表中一行记录的类型。当用户使用了“SELECT … INTO …”将表中的一行记录设置到了ROWTYPE类型的变量之中,就可以利用 “rowtype变量.表字段”的方式取得表中每行的对应列数据。

(11)使用ROWTYPE装载一行记录

SCOTT@SDEDU> ed011104.sql

declare

deptrow dept%rowtype;

begin

select * into deptrow from dept where deptno=10;

dbms_output.put_line('number is '||deptrow.deptno||'name is '||deptrow.dname||'location is '||deptrow.loc);

end;

/


SCOTT@SDEDU> @011104.sql

number is 10name is ACCOUNTINGlocation is NEW YORK

PL/SQL procedure successfully completed.

推荐阅读

SQL语句 之 with子句 & 分析函数

晟数学院DBA成长日记

SQL语句 之 完整性约束

晟数学院DBA成长日记

SQL语句 之 序列

晟数学院DBA成长日记

记得长按上方二维码关注我们~
文章转载自晟数学院,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论