
点击“蓝字”关注我们

晟数学院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.
推荐阅读
晟数学院DBA成长日记

晟数学院DBA成长日记

晟数学院DBA成长日记







