----------------------------PL/SQL的组成------------------------------------------------------------
PL/SQL块由3部分组成:声明部分、执行部分、异常处理部分
[declare]
--声明部分:在此声明PL/SQL用到的变量、类型及游标,以及局部的存储过程和函数
begin
--执行部分:过程及SQL语句,即程序的主要部分,不可省略
[exception]
--异常处理部分:错误处理
end;
----------------------------PL/SQL变量和常量的声明--------------------------------------------------
变量:variable_name?data_type[(size)][:=?init_value];
--variable_name表示变量名称
--data_type表示变量的SQL或PL/SQL数据类型
--size指定变量的范围。
--init_value指定变量的初始值
--常量:variable_name?CONSTANT?data_type?:=?value;(注意常量必须赋初始值)
----------------------------PL/SQL变量赋值----------------------------------------------------------
方法一:通过select?into?给变量赋值,查询结果只返回一条数据并赋值到变量中保存,返回多条或零条数据则报错。
DECLARE
v_ename VARCHAR2(20);
v_rate NUMBER(7,2);
v_no?number;
c_rate_incr CONSTANT NUMBER(7,2):=1.10;
BEGIN
SELECT ename,sal*c_rate_incr INTO v_ename,v_rate FROM emp
WHERE empno=7369;
--方法二:通过赋值操作符":="给变量赋值myseq.nextval取的是索引值11g的新特性
v_ename:='SCOTT';
v_no:=myseq.nextval;
END;
---------------------------PL/SQL中标识符定义的要求和限制:-----------------------------------------
1)标识符名称不能超过30个字符。
2)第一个字符必须是字母。
3)不区分大小写。
4)不能用”-”减号。
5)不能用SQL的保留字。
程序变量 v_开头
程序常量 c_
游标变量 cursor_
异常标志 e_
--------------------------PL/SQL中编码规则----------------------------------------------------------
(1)利用缩进排列展现逻辑结构。保留字后出现的列开始缩进三个空格,如declare下面声明变量行。
(2)利用大小写增强可读性。保留字统一大写;?应用程序专用名称或标识符统一小写。
(3)格式化单独语句。每行至多写一条语句;?声明语句中尽量保持声明的数据类型近变量名,而不是与数据类型对齐。
(4)格式化SQL语句。右对齐DML语句的子句中的保留字。
--------------------------注释-----------------------------------------------------------------------
1)使用双“-”减号加注释,只在一行有效,如:
v_sal?NUMBER(12,2);?--人员的工资变量
2)使用“/*?*/”来加一行或多行注释,建议使用如下方式
/*
||在注释首行只放斜线星号,标志注释开始
||,然后注释块每一行以双垂直线开头,突出后面的注释内容。可以不写,但为了可读性
*/
-------------------------PL/SQL数据类型--------------------------------------------------------------
1.标量数据类型,包含单个值,没有内部组件。包括数字、字符、布尔值和日期时间值。
--例如:CHAR,VARCHAR2,DATE,BOOLEAN等......
2.LOB(Large?OBject)数据类型,用于存储大的数据对象的类型,主要支持BFILE、BLOB、CLOB、NCLOB类型。
3.属性类型,属性用于引用变量或数据库列的数据类型,以及表示表中一行的记录类型。
1)%TYPE
--定义一个变量,其数据类型与已经定义的某个数据变量(尤其是表的一列)的数据类型一致。
2)%ROWTYPE
--返回一个记录类型,其数据类型和数据库表的数据结构一致。
用法:
DECLARE
v_empno emp.empno%TYPE:=7369;
v_rec emp%ROWTYPE;
BEGIN
SELECT * INTO v_rec FROM emp
WHERE empno=v_empno;
DBMS_OUTPUT.PUT_LINE('姓名:'|| v_rec.ename||'工资:'||v_rec.sal);--输出一行,只在PL/SQL块中
END;
-----------------------PL/SQL控制语句----------------------------------------------------------------
1.条件控制,用于根据条件执行一系列语句。条件控制包括IF语句和CASE语句。
-----------1)IF语句语法:
IF?<布尔表达式>?THEN --if
???--PL/SQL和SQL语句
END?IF;
--例子:
BEGIN
IF 1=1 THEN
DBMS_OUTPUT.PUT_LINE('猪猪');
END IF;
END;
-------------
IF?<布尔表达式>?THEN --if-else
--PL/SQL和SQL语句
ELSE
--其他语句
END?IF;
--例子:
BEGIN
IF 1=2 THEN
DBMS_OUTPUT.PUT_LINE('猪猪');
ELSE
DBMS_OUTPUT.PUT_LINE('狗狗');
END IF;
END;
-------------
IF?<布尔表达式>?THEN --if-else?if-else
--PL/SQL和SQL语句
ELSIF?<其他表达式>?THEN --?这里是elsif?而不是elseif,注意!!!
--其他语句
ELSIF?<其他表达式>?THEN
--其他语句
ELSE
--其他语句
END?IF;
--例子:
BEGIN
IF 1=2 THEN
DBMS_OUTPUT.PUT_LINE('王可可');
ELSIF 1=3 THEN
DBMS_OUTPUT.PUT_LINE('是');
ELSE
DBMS_OUTPUT.PUT_LINE('碧池');
END IF;
END;
-----------2)CASE语句语法:
--格式一
CASE?条件表达式
WHEN?条件表达式结果1?THEN?语句段1
WHEN?条件表达式结果2?THEN?语句段2
.....
WHEN?条件表达式结果n?THEN?语句段n
[ELSE?语句段]
END?CASE;
--例子:
DECLARE
v_char VARCHAR2(20);
BEGIN
CASE 'l'
WHEN 'A'
THEN v_char:='优秀';
WHEN 'B'
THEN v_char:='良好';
WHEN 'C'
THEN v_char:='差劲';
ELSE
v_char:='无语';
END CASE;
DBMS_OUTPUT.PUT_LINE(v_char);
END;
--格式二
CASE
WHEN?条件表达式1?THEN?语句段1
WHEN?条件表达式2?THEN?语句段2
.....
WHEN?条件表达式n?THEN?语句段n
[ELSE?语句段]
END?CASE;
--例子:
DECLARE
v_char VARCHAR2(20);
BEGIN
CASE
WHEN 1>2
THEN v_char:='优秀';
WHEN 1<2
THEN v_char:='良好';
WHEN 1>8
THEN v_char:='差劲';
ELSE
v_char:='无语';
END CASE;
DBMS_OUTPUT.PUT_LINE(v_char);
END;
2.循环控制,用于重复执行的系列语句。包括LOOP和EXIT语句,使用EXIT语句可以立即退出循环;?使用EXIT?WHEN
语句可以根据条件结束循环。有3种类型循环,包括LOOP循环、WHILE循环、FOR循环。
----------1)LOOP循环语法:
LOOP
要执行的语句;
EXIT?WHEN?<条件语句>??--条件满足,退出循环语句
END?LOOP;
--例子:
DECLARE
v_count NUMBER:=0;
BEGIN
LOOP
v_count:=v_count+1;
DBMS_OUTPUT.PUT_LINE(v_count);
EXIT WHEN v_count=5;
END LOOP;
END;
----------2)WHILE循环语法:
WHILE?<布尔表达式>?LOOP
要执行的语句;
END?LOOP;
--例子:
DECLARE
v_count NUMBER:=0;
BEGIN
WHILE v_count<5 LOOP
v_count:=v_count+1;
DBMS_OUTPUT.PUT_LINE(v_count);
END LOOP;
END;
----------3)FOR循环语法:
FOR?循环计数器?IN?[REVERSE]?下限?....?上限?LOOP
要执行的语句;
END?LOOP;?
例子:
DECLARE
v_num NUMBER:=1;
BEGIN
FOR v_num IN REVERSE 1..10 LOOP --reverse由大到小
DBMS_OUTPUT.PUT_LINE(v_num);
END LOOP;
END;
3.顺序控制,用于按顺序执行语句。顺序控制包括NULL语句和GOTO语句。GOTO语句不推荐使。
NULL语句:是一个可执行语句,相当于一个占位符或不执行任何操作的空语句,可以便某些语句变得有意义,提高程
序的可读性,保证其他语句结构的完整性和正确性。
--例子:
DECLARE
v_count NUMBER :=5;
BEGIN
DBMS_OUTPUT.PUT_LINE('当前值为:'||v_count);
IF v_count >= 10 THEN
NULL;
ELSE
v_count := v_count +10;
DBMS_OUTPUT.PUT_LINE('改变值为:'||v_count);
END IF;
END;