【网学网提醒】:网学会员为需要朋友们搜集整理了19、PLSQL语法基础相关资料,希望对各位网友有所帮助!
?PL/SQL也是一种程序语言,叫做过程化SQL语言(ProceduralLanguage/SQL)。PL/SQL是Oracle数据库
对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL就是把数据操作和查询语句
组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言。
PL/SQL集成了现代软件工程的特点,将SQL的数据操作功能与过程化语言数据处理功能结合起来,允许使用循
环、分支等过程化方法来处理数据。PL/SQL是ORACLE数据库应用的重要开发工具。
结构化查询语言是用来访问关系型数据库的一种能用语言,属于第四代语言(4GL),其执行特点是非过程化,
即不用指明执行的具体方法和途径,而是简单地使用相应语句来直接取得结果。这种不关注任何细节的语言,
对于开发者极为方便。然而,有些复杂的业务流程要求相应的程序来描述,这种情况下,第四代语言就有些无
能为力了。PL/SQL的出现正是为了解决这一问题。PL/SQL是一种过程化的语言,它属于第三代语言(3GL),
它与C++、JAVA一样关注于处理细节,可以用来实现比较复杂的业务逻辑。
PL/SQL程序语言的组成
PL/SQL程序由块结构构成,在PL/SQL程序中含有变量、各种不同的程序控制结构、异常处理模块、子程
序(过程、函数、包)、触发器等。
PL/SQL程序的基本结构
PL/SQL块由四个基本部分组成:声明、执行体开始、异常处理、执行体结束。
PL/SQL注释:
/*和*/之间的多行注释;
以--开始的单行注释。
PL/SQL块简介
构成PL/SQL程序的基本单元是语句块,所有的PL/SQL程序都是由语句块构成的,每个语句块完成特定
的功能,语句块可以具有名字(命名块),也可以不具有名字(匿名块),语句块之间还可以相互嵌套。
块结构:
一个完整的PL/SQL语句块由以下3个部分组成:
DECLARE
......
BEGIN
......
EXCEPTION
......
END;
(1)定义、声明部分
DECLARE开始,到BEGIN结束。在此主要定义程序所要使用的常量、变量、数据类型、
游标、异常处理名称等。PL/SQL程序中所有需要定义的内容必须在该部分集中定义。
不能在执行的时候定义。定义、声明部分是可选的。在进行变量定义时一般是类型后置。
(2)执行部分
关键字BEGIN开始,END结束(如果PL/SQL块中有异常处理部分,则以EXCEPTION结束)
它是PL/SQL块的功能实现部分,该部分通过一系列语句和流程控制,实现数据查询、
数据操作、事务控制、游标处理等数据库操作的功能。执行部分是必须的
(3)异常处理部分
以关键字EXCEPTION开始,END结束。该部分用于
处理该PL/SQL块执行过程中产生的
错误。异常处理部分是可选的。
所有的PL/SQL块都以END;结束。可以一个块的执行部分或异常处理部分嵌套其他的PL/SQL块。
匿名块:
PL/SQL匿名块,是指动态生成,只能执行一次的块,它没有名字,不能由其它应用程序调用。
如:
SQL>SETSERVEROUTPUTON
SQL>BEGIN
2DBMS_OUTPUT.PUT_LINE('Thisamininumanonymousblock');
3END;
4/
编写一个PL/SQL块,输出empno为7834的记录
1.SQL>SETSERVEROUTPUTON
SQL>DECLARE
2v_nameVARCHAR2(10);--数据类型后置
3BEGIN
4SELECTenameINTOv_nameFROMempWHEREempno='7839';
5DBMS_OUTPUT.PUT_LINE('7834''snameis:'||v_name);
6END
7;
8/
7834'snameis:KING
PL/SQL过程已成功完成。
2.SQL>DECLARE
2v_nameVARCHAR2(10);
3empnoNUMBER(4);
4BEGIN
5SELECTenameINTOv_nameFROMempWHEREempno=&;empno;
6DBMS_OUTPUT.PUT_LINE('nameis:'||v_name);
7END;
8/
输入empno的值:7900
原值5:SELECTenameINTOv_nameFROMempWHEREempno=&;e
mpno;
新值5:SELECTenameINTOv_nameFROMempWHEREempno=79
00;
nameis:JAMES
PL/SQL过程已成功完成。
3.本例中,如果记录不存在就会出错,为此我们可以加入异常处理
SQL>DECLARE
2v_nameVARCHAR2(10);
3empnoNUMBER(4);
4BEGIN
5SELECTenameINTOv_nameFROMempWHEREempno=&;empno;
6DBMS_OUTPUT.PUT_LINE('nameis:'||v_name);
7EXCEPTION
8WHENNO_DATA_FOUNDTHEN
9DBMS_OUTPUT.PUT_LINE('notfoundrecord!');
10END;
11/
输入empno的值:100
原值5:SELECTenameINTOv_nameFROMempWHEREempno=&;e
mpno;
新值5:SELECTenameINTOv_nameFROMempWHEREempno=10
0;
notfoundrecord!
PL/SQL过程已成功完成。
命名块
命名块是指一次编译可多次执行的PL/SQL程序,包括自定义函数、过程、包、触发器等。
它们编译后放在服务器中,由应用程序或系统在特定条件下,调用执行。
另外,在复杂的PL/SQL中,可以在一个PL/SQL块中包含另一个PL/SQL块,这种现象称为块嵌套。
PL/SQL语法要素:
PL/SQL程序都是由基本语法要素构成。PL/SQL基本语法要素包括字符集、标识符、文本、分隔符、
注释等。
字符集:
PL/SQL字符集包括:
大小写英文字母A-Z和a-z。
0-9数字
空白符,包括制表符、空格、回车。
特殊符号,包括~、!、@、#、$、%、*、(、)、_、-、+、=、|、:、;、"、'、<、>、,、.、?、/、^等。
PL/SQL字符集不区分大小写
标识符:
用于定义PL/SQL变量、常量、异常、游标名称、游标变量、参数、子程序名称和其它的程序单元名
称等。以字母开头,最大长度为30个字符,并且所有的字符都是有效的。如果标识符区分大小写、
使用预保留关键字、或包含空格等特殊符号,需要用英文双引号("")括起来,称为引证标识符。
文字:
所谓文字是指不能作为标识符的数字型、字符型、日期型和布尔型数值。
(1)数值型文字
数值型文字分为整数与实数两类。数值型文字可以直接在sql语句的算术表达式中引用。PL/SQL还
可以使用科学计数法和幂操作符。
SQLPL/SQL均可使用: 常规的数值表式方法,如3.14、2008
PL/SQL还可以使用: 科学计算法和幂操作符,如-10E4、5.123e-6、7*10**2
(2)字符型文字
字符型文字用单引号括起来的一个或多个字符。在字符型文字中区分大小写。如果字符型文字中
本身包含单引号,则用两个连续的单引号进行转义。在ORACLE10G中,如果字符串文本包含单引
号,那么还可以使用其他分隔符(如[]、()、<>等)赋值。注意,如果要使用分隔符[]、()、<>为
字符串赋值,那么不仅需要在分隔符前后加单引号,而且需要带有前缀q。
如:
使用单引号:'7'、'K'、'='、'Iamastudent.'
使用其他分隔符:'I''mastudent'、q'[I'mastudent.]'
(3)日期型文字
日期型文字表示日期时间值,形式与字符串类似。日期型数值也必须放在单引号之中,同时日期
型数值格式随日期类型格式和日期语言不同而不同。日期型文字的示例如下:
'01-04月-1963''2008-01-0108:00:01'
(4)布尔型文字
包括TRUE、FALSE、NULL三个值。
分隔符
分隔符由具有特定含义的单个字符或组合字符构成。用户可以使用分隔符完成诸如算术运算、数值比较、
给变量赋值等操作。
算术运算符:
+、-、*、/、**(乘方)
比较操作符:
=、<>、~=、!=、^=(四个均为不等于)、<、<=、>、>=
其他分隔符:
(、)、:=(赋值)、'、"、,(列表项分隔)、@(数据库连接分隔符)、;(语句结束)、
||(字符串连接)、=>(联合操作符,调用子程序,给其传递参数)、
<<、>>(标号开始与结束符)、--(单行注释)、
/*、*/(多行注释开始与结束)、%(属性指示器,一般与TYPE、ROWTYPE等一起用)
注释
单行注释:--
多行注释:/*注释内容
,可跨行*/
变量及其数据类型
PL/SQL变量的数据类型包括标量类型、复合类型、引用类型和LOB类型。
标量变量:
只存放单个数值的变量,包括数字型、字符型、日期时间型、布尔型等多种数据类型。
(1)数字类型
NUMBER 最大长度38位,小数部分位数-84~127。
PLS_INTEGER 数值范围-2147483647~2147483647。其子类型包括NATURAL、NATURALN、
POSITIVE、POSITIVEN和SIGNTYPE。对新开发的应用系统来说,
ORACLE推荐PLS_INTEGER,而不要使用BINARY_INTEGER。像
BINARY_INTEGER类型一样,PLS_INTEGER也是在当不需要在数据库中
存储这个数值,而只在算术运算中使用这个数字的时候才用这种数字类型。
BINARY_INTEGER数值范围-2147483647~2147483647,当不需要在数据库中存储这个
数值,而只在算术运算中使用这个数字的时候才用这种数字类型。
BINARY_DOUBLE双精度浮点型,10G中新引入的,在科学计算中,有性能优势。
BINARY_FLOAT 单精度浮点型
(2)字符类型
CHAR 定长字符串
NCHAR
VARCHAR
VARCHAR2
NVARCHAR2
LONG
RAW
LONGRAW
ROWID
UROWID
(3)日期时间型
DATE 存储世纪、年、月、日、时、分、秒。秒不能带小数
TIMESTAMP
INTERVAL
(4)布尔型
TURE
FALSE
NULL
复合变量
复合类型的变量包含一个或多个标量变量。
复合类型包括记录、嵌套表、index-by表、和数组
引用变量(参照变量)
PL/SQL中包含两种引用类型,即REFCURSOR类型和REF类型。
LOB变量
CLOB
NCLOB
BLOB
BFILE
在PL/SQL中执行SQL语句
执行SELECT语句
在PL/SQL中执行SELECT语句要加INTO,其格式为:
SELECTexpression_listINTOvariable_list|record_variable
FROMtable_nameWHEREcondition;
例1:在dept表中查询部门编号为10的部门,将部门名和工作地点显示出来
DECLARE
v_namedept.dname%TYPE;
v_locdept.loc%TYPE;
v_iddept.deptno%TYPE;
BEGIN
SELECTdname,locINTOv_name,v_locFROMdeptWHEREdeptno=(&;v_id);
DBMS_OUTPUT.PUT_LINE('deptnameis:'||v_name);
DBMS_OUTPUT.PUT_LINE('deptlocis:'||v_loc);
EXCEPTION
WHENNO_DATA_FOUNDTHEN
DBMS_OUTPUT.PUT_LINE('notfoundrecord!');
END;
/
输入v_id的值:10
原值6:SELECTdname,locINTOv_name,v_locFROMdeptWHEREdeptn
o=(&;v_id);
新值6:SELECTdname,locINTOv_name,v_locFROMdeptWHEREdeptn
o=(10);
deptnameis:ACCOUNTING
deptlocis:NEWYORK
PL/SQL过程已成功完成。
例2:查询7788记录的信息
DECLARE
v_studentemp%ROWTYPE;
BEGIN
SELECT*INTOv_studentFROMempWHEREempno=(&;v_student);
DBMS_OUTPUT.PUT_LINE('idnamejobsal');
DBMS_OUTPUT.PUT_LINE(v_student.empno||''||v_student.ename
||''||v
_student.job||''||v_student.sal);
EXCEPTION
WHENNO_DATA_FOUNDTHEN
DBMS_OUTPUT.PUT_LINE('notfoundrecord!');
END;
/
输入v_student的值:7788
原值4:SELECT*INTOv_studentFROMempWHEREempno=(&;v_student
);
新值4:SELECT*INTOv_studentFROMempWHEREempno=(7788);
idnamejobsal
7788SCOTTANALYST3000
PL/SQL过程已成功完成。
注:如果查询的结果有多条记录的话,要用游标,否则会产生TOO_MANY_ROW异常。
执行DML语句
1、执行insert
DECLARE
v_idemp.empno%TYPE:=8000;
v_nameemp.ename%TYPE:='zhangsan';
v_jobemp.job%TYPE:='MGR';
v_salemp.sal%TYPE:=5000;
BEGIN
INSERTINTOEMP(empno,ename,job,sal)VALUES
(v_id,v_name,v_job,v_sal);
END;
/
SQL>select*fromemp
2whereempno=8000;
EMPNOENAMEJOBMGRHIREDATESALCOMM
-------------------------------------------------------------------------
DEPTNO
----------
8000zhangsanMGR5000
2、执行update
DECLARE
v_idemp.empno%TYPE:=8000;
v_nameemp.ename%TYPE:='ZHANGSAN';
v_jobemp.job%TYPE:='ANALYST';
BEGIN
UPDATEempSETename=v_name,job=v_jobWHEREempno=v_id;
END;
/
SQL>select*fromemp
2whereempno=8000;
EMPNOENAMEJOBMGRHIREDATESALCOMM
-------------------------------------------------------------------------
DEPTNO
----------
8000ZHANGSANANALYST5000
3、执行delete
DECLARE
v_idemp.empno%TYPE;
BEGIN
DELETEFROMempWHEREempno=&;v_id;
END;
/
输入v_id的值:8000
原值4:DELETEFROMempWHEREempno=&;v_id;
新值4:DELETEFROMempWHEREempno=8000;
PL/SQL过程已成功完成。
SQL>select*fromemp
2whereempno=8000;
未选定行
在PL/SQL中执行事务处理语句
与在SQL中完全一样
DECLARE
v_idemp.empno%TYPE:=8000;
v_nameemp.ename%TYPE:='zhangsan';
v_jobemp.job%TYPE:='MGR';
v_salemp.sal%TYPE:=5000;
BEGIN
INSERTINTOEMP(empno,ename,job,sal)VALUES(v_id,v_name,v_job,v_sal);
COMMIT;
UPDATEempSETename='TEST',job='TEMP_JOB'WHEREempno=8000;
ROLLBACK;
DELETEFROMempWHEREempno=8001;
COMMIT;
END;
/