PL/SQL入门教程
本文部分内容节选自文末推荐文章,如有侵权,请联系
一、什么是PL/SQL
PL/SQL是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码中,通过逻辑判断、循环等操作实现复杂的功能或者计算。PL/SQL 只有 Oracle 数据库有。 MySQL有自己的MySQL数据库编程。
二、如何使用PL/SQL
一)声明变量
本课重点:
1、了解基本的PLSQL块和区域
2、描述变量在PLSQL中的重要性
3、区别PLSQL与非PLSQL变量
4、声明变量
5、执行PLSQL块
一、概述:
1、PLSQL块结构:
DECLARE —可选
变量声明定义
BEGIN —-必选
SQL和PLSQL语句
EXCEPTION —-可选
错误处理
END;—-必选
二、实例:
declare ——声明
vjob varchar(9); ———定义一个变量,数据类型为varchar 长度为9 名称为vjob
v_count number:=0; ——-定义一个变量,数据类型为number 赋值为0
vtotal date:=sysdate 7;
c_tax constant number(3,2):=8.25; ——定义一个常量
v_valid boolean not null:=true; —定义的一个不为空的boolean类型变量
begin
select sysdate into vtotal from dual; —将sysdate的值赋值给vtotal
— pl/sql赋值的两种方式
a. :=
b. into
end;
上例中,如果没有这个SELECT语句,会如何? 出错,说明必须有STATEMENTS
三、%TYPE的属性
声明一个变量使之与数据库某个列的定义相同或与另一个已经定义过的变量相同
所以%TYPE要作为列名的后缀:如:
v_last_name s_emp.last_name%TYPE; ——定义一个变量v_last_name 变量的类型是s_emp表中last_name这个列对应的数据类型
v_first_name s_emp.first_name%TYPE; –这样做的好处是我们不必去知晓此列的类型与定义
或:v_balance NUMBER(7,2); v_minimum_balance v_balance%TYPE := 10;
四、声明一个布尔类型的变量
1只有TRUE、FALSE、NULL可以赋值给BOOLEAN变量
2此变量可以接逻辑运算符NOT、AND、OR。
3变量只能产生TRUE、FALSE、NULL。
实例:
VSAL1:=50000; VSQL2:=60000; VCOMMSAL BOOLEAN:=(VSAL1<VSQL2);
—其实是把TRUE赋值给此变量。
二)写执行语句
本课重点:
1、了解PLSQL执行区间的重要性
2、写执行语句
3、描述嵌套块的规则
4、执行且测试PLSQL块
5、使用代码惯例
一、PLSQL块的语法规则:
1、语句可以跨跃几行。
2、词汇单元可以包括:分隔符、标识符、文字、和注释内容。
3、分隔符:
-*/=<>||….
4、标识符:
最多30个字符,不能有保留字除非用双引号引起。
字母开头,不与列同名。
5、文字串:如V_ENAME:=’FANCY’;要用单引号括起来。
数值型可以用简单记数和科学记数法。
6、注释内容:单行时用– 多行用/* */
二、SQL函数在PL/SQL的使用:
1、可用的:
单行数值型、字符型和转换型,日期型。
2、不可用的:
最大、最小、DECODE、分组函数。
实例:
BEGIN
SELECT TO_CHAR(HIREDATE,’MON,DD,YYYY’) FROM EMP;
END;
V_comment:=user||’:’||sysdate; –会编译出错
V_comment:=user||’:’||to_char(sysdate); –正确
如果有可能,PLSQL都会进行数据一致性的转换,但ORACLE推荐你应该进行显示的转换,因为这样会提高性能。
三、嵌套块和变量作用区域
1、执行语句允许嵌套时嵌套。
2、嵌套块可以看作正常的语句块。
3、错误处理模块可以包括一个嵌套块
4、exponential指数逻辑、算数、连接、小括号
5、看正面实例:
declare
job varchar(9);
_count number:=0;
total date:=sysdate 7;
_tax constant number(3,2):=8.25;
_valid boolean not null:=true;
tt vtotal%type;
begin
–select sysdate into vtotal from dual;–体会有无此句与结果的影响
dbms_output.put_line (vtotal); —plsql中自带的对象的方法—》 打印
end;
/ ——-斜杠表示执行上一个plsql语句
注意:在执行块之前,要先执行:SET SERVEROUTPUT ON(开启打印)
四、以实例来说明函数的参数声明作用域
declare
v_weight number(3):=600;
v_message varchar2(255):=’product10000′;
begin
declare
–sub-block
v_weight number(3):=1;
v_message varchar2(255):=’pro300′;
begin
v_weight:=v_weight 1;dbms_output.put_line(‘subblock value is ‘||v_weight);
end;
v_weight:=v_weight 1;
v_message:=v_message || ‘my name’;
end;
子块中的V_WEIGHT值为2
我们可以在子块中加入:dbms_output.put_line(‘subblock value is ‘||v_weight);
在主体中加入:dbms_output.put_line(‘main value is ‘||v_weight);
我们发现MAINBLOCK中V_WEIGHT为601
改动:
1、在主块的声明中加 v_date date default sysdate;
在子块中加入:dbms_output.put_line(‘subblock date value is ‘||v_date);
执行结果:subblock date value is 22-11月-01
说明:主块中的变量,如果子块中没有同名变量声明,则继承主块中的声明和初始化值;
2、在子块中加入:v_sub char(9);
dbms_output.put_line(‘subblock char value is ‘||v_sub);
此时正常输出。
在主块中加入:dbms_output.put_line(‘main char value is ‘||v_sub);
输出:ORA-06550:第21行,第45列:
PLS-00201:必须说明标识符’V_SUB’
说明:
子块中声明的变量主块中并不知晓,因此出错。
了解了此实例,一切情况的变量的值的走向就都明了了。
三)与ORACLE SERVER交互
本课重点:
1、在PLSQL中成功的写SELECT语句
2、动态声明PLSQL变量类型与SIZE
3、在PLSQL中写DML语句
4、在PLSQL中控制事务
5、确定DML操作的结果
一、PLSQL中的SQL语句:
SELECT、DML、COMMIT、ROLLBACK、SAVEPOINT、CURSOR
savepoint savepoint_name
这个命令就是在事务语句之间创建一个保存点。rollback命令可以撤销一组事务操作,而保存点可以将大量事务操作划分为较小的,更易于管理的组。
特殊强调:PLSQL不支持DCL
二、SELECT
SELECT select_list
INTO variable_name | record_name
FROM table
WHERE condition;
例:
SQL> r
declare
v_deptno number(2);
v_loc varchar2(15);
begin
select deptno,loc
into v_deptno,v_loc
from dept
where dname=‘SALES’; —-将查询出来的deptno赋值给v_deptno 将loc赋值给v_loc
DBMS_OUTPUT.PUT_LINE (V_deptno ||’ and ‘||v_loc); —打印语句
end;
选取字段与变量个数和类型要一致。声明的变量一定要在SIZE上大于返回的赋值,否则提示缓冲区溢出。
如果SELECT语句没有返回值:ORA-01403:未找到数据
ORA-06512:在line 5
如果有多个值返回:ORA-01422:实际返回的行数超出请求的行数
这些我们到了错误处理时会逐一讲解。
例:
上面的例子可以改为:
declare
v_deptno dept.deptno%type;
v_loc dept.loc%type;
begin
select deptno,loc
into v_deptno,v_loc
from dept
where dname=’SALES’;
DBMS_OUTPUT.PUT_LINE (V_deptno ||’ and ‘||v_loc);
end;
/
这样,可以在未知其他字段大小和类型的时候定义变量,提高兼容性。
三、DML操作(DML是SQL的一个子集,主要用于修改数据的一些基本操作):
1、实例:
declare
v_empno emp.empno%type;
begin
select max(empno)
into v_empno
from emp;
v_empno:=v_empno 1;
insert into emp(empno,ename,job,deptno)
values(v_empno,’asdfasdf’,’ddddd’,10);
end;
这样也可以实现如SEQUENCE一样的编号唯一递增。
2、更新和删除:
这个较为简单:
DECLARE
V_DEPTNO EMP.DEPtno%type :=10;
begin
delete from emp
where deptno=v_deptno;
end;
大家多多实践即可掌握。
PLSQL首先检查一个标识符是否是一个数据库的列名,如果不是,再假定它是一个PLSQL的标识符。所以
如果一个PLSQL的变量名为ID,列中也有个ID,如:
SELECT date_ordered, date_shipped
INTO date_ordered, date_shipped
FROM s_ord
WHERE id = id;
就会返回TOO MANY ROWS,这是要尽量避免的。
最后希望大家在讨论区踊跃发言,文中如有错误及时联系小编。
不明白的地方,也可以留言我们一起讨论。