就算你不知道PL/SQL,但是作为开发人员,你应该知道SQL。这就够了,PL/SQL和SQL是一路货色,都是一种数据库语言,而PL/SQL只不过是Oracle公司对SQL扩展的结果。好了,我想你已经知道什么是PL/SQL了——SQL的加强版,只对Oracle数据库好使,对MySQL等其它数据库不好使。不要问我为什么varchar2
在MySQL中不好用这样的问题。
作为一门开发语言,基本要素无外乎就是下面的几个方面:
请记住,在PL/SQL中,不区分大小写。
- 标识符的最小长度是1,最大长度是30。但是,标识符的第一个字符必须是字母
- 和其它语言一样,不能使用系统保留的关键字
-- 获得特殊号码
select * from ac.sys_spec_tel;
/**
* 获得特殊号码
* @author 果冻想
* @date 20150713
*/
select * from ac.sys_spec_tel;
写PL/SQL程序,就需要知道PL/SQL程序是以块为单位的,块其实就是一段程序,基本格式如下:
-- Created on 2015-7-13 by 果冻想
[declare]
-- declaration statements
i integer;
begin
-- executable statements
[exception]
-- exception statements
end;
variable_name constant datatype [not null] [:=|default expression]
variable_name datatype [not null] [:=|default expression]
来,看一段代码,说说变量定义与变量作用范围:
declare
jellythink constant varchar2(40) := 'http://www.jellythink.com'; -- 定义一个常量
site varchar2(40); -- 定义一个变量
begin
site := 'http://www.jellythink.com';
-- 嵌套块
declare
site varchar2(40); -- 覆盖了外部定义的site
begin
site := 'http://www.google.com';
dbms_output.put_line(site); -- 输出:http://www.google.com
end;
dbms_output.put_line(site); -- 输出:http://www.jellythink.com
dbms_output.put_line(jellythink); -- 输出:http://www.jellythink.com
end;
这个变量的作用域和C++的有几分相似,可以拿来比较一下。
SUBTYPE 子类型的名字 IS 基本数据类型 [(constraint)] [NOT NULL]
看个简短的代码,就啥都明白了。
declare
SUBTYPE AGE IS NUMBER(3); -- 用户自定义的类型
v AGE; -- 使用自定义类型定义变量
begin
v := 20;
dbms_output.put_line(v);
end;
看以下这段关于数据类型转换的代码:
declare
str varchar2(20) := '1314';
i number;
i2 number := 520;
begin
i := str; -- 隐士转换
str := i2; -- 隐士转换
dbms_output.put_line(i);
dbms_output.put_line(str);
-- 显示转换,将日期转换成指定格式的字符串
dbms_output.put_line(to_char(sysdate, 'YYYY-MM-DD'));
end;
运算符 | 含义 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
** | 乘方 |
运算符 | 含义 |
---|---|
AND | 两者同时为真,结果才为真(TRUE) |
OR | 只要其中一个为真,结果就为真(TRUE) |
NOT | 取反 |
运算符 | 含义 |
---|---|
IS NULL | 如果测试值为NULL,则返回TRUE;如果测试值不为NULL,则返回FALSE |
LIKE | 比较字符串值,结合’%’进行模糊匹配 |
BETWEEN | 测试值是否在指定的范围之内 |
IN | 测试操作数是否在一系列的值中 |
运算符 | 含义 |
---|---|
= | 等于 |
<>、!=、~= | 不等于 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
运算符 | 含义 |
---|---|
|| | 连接符用于连接两个字符串 |
这里的控制结构的含义与其它语言中的是一致的,所以只总结语法结构。
IF 条件1 THEN
执行语句1;
执行语句2;
END IF;
IF 条件1 THEN
执行语句1;
执行语句2;
ELSIF 条件2 THEN
执行语句3;
执行语句4;
ELSE
执行语句5;
执行语句6;
END IF;
IF ELSE
结构就使代码显的比较杂乱,不易阅读。这个时候使用CASE
应该是最佳的选择。CASE
结构如下:
CASE [ expression ]
WHEN condition_1 THEN result_1
WHEN condition_2 THEN result_2
...
WHEN condition_n THEN result_n
ELSE result
END
LOOP
执行循环语句;
END LOOP;
FOR counter IN 1..10 LOOP
-- 测试一下,输出counter值
dbms_output.put_line(counter);
END LOOP;
WHILE i <= 10 LOOP
dbms_output.put_line(i);
i := i + 1;
END LOOP;
LOOP
执行语句1;
EXIT;
END LOOP;
执行到EXIT就立刻退出循环。
LOOP
执行语句1;
EXIT WHEN 条件1;
END LOOP;
当执行到EXIT
时,要对条件1进行判断,如果条件1返回真,将退出循环,跳到END LOOP之后接着执行代码;如果条件1返回假,将继续循环。
LOOP
执行语句1;
CONTINUE;
执行语句2;
END LOOP;
当执行到CONTINUE
语句时,将无条件终止本次循环的执行,也就是说跳过执行语句2,继续执行循环。
LOOP
执行语句1;
CONTINUE WHEN 条件1;
执行语句2;
END LOOP;
当执行到CONTINUE WHEN
语句时,将堆条件1进行判断,如果条件1结果为真,将终止本次循环,执行语句2将被跳过,开始下一次循环;如果测试结果为假,将继续执行CONTINUE WHEN
语句后面的代码。
臭名昭著的GOTO,本来不想讲,但是为了这篇文章的完整性,就使用下面这段代码,足以。
declare
m varchar2(20);
begin
m := 'JellyThink';
<<Label1>>
dbms_output.put_line(m);
goto Label1;
end;
内容太多,独立成文,请参见这篇文章《Oracle学习笔记——异常处理》。
2015年7月9日 于包头。