本节书摘来自异步社区出版社《Oracle PL/SQL程序设计(第5版)》一书中的第1章,第1.3节,作者:【美】Steven Feuerstein , Bill Pribyl,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.3 这就是PL/SQL
Oracle PL/SQL程序设计(第5版)
如果你对编程或者使用PL/SQL(或者甚至是SQL)还完全是个新手,学习PL/SQL看起来可能有点可怕。如果是这样,不要急!我肯定你会发现这要比你想的简单得多。我之所以这么肯定是由于两个原因。
计算机语言总的来说都不难学,至少和第二种或者第三种“人类语言”比起来是这样。为什么?因为计算机还没有那么聪明(它们“思考”─执行操作─很快,可是没有创新能力)。我们必须要靠严格的语法才能准确地告诉计算机我们到底要让它做什么。因此导致语言也是很严格的(没有例外!)因此我们学起来也很容易。
和其他的编程语言比起来,PL/SQL也确实是一种很容易的语言。它的不同单元都是使用一种高度结构化的“块”设计,全都是通过显式的、自我说明的关键字来标识。
我们通过几个例子演示一下PL/SQL结构和功能有关的一些关键元素。
1.3.1 与SQL整合
PL/SQL一个最重要的方面就在于它和SQL是紧密整合的。我们在PL/SQL程序中运行SQL语句无需借助任何类似于ODBC(开发数据库连接)或者JDBC(Java数据库连接)这样的中间软件“粘合剂”。相反,我们只需要在代码中插入UPDATE或者SELECT就可以了,像这样:
1 DECLARE
2 l_book_count INTEGER;
3
4 BEGIN
5 SELECT COUNT(*)
6 INTO l_book_count
7 FROM books
8 WHERE author LIKE '%FEUERSTEIN, STEVEN%';
9
10 DBMS_OUTPUT.PUT_LINE (
11 'Steven has written (or co-written) ' ||
12 l_book_count ||
13 ' books.');
14
15 -- 噢,我已经改名了,所以..
16 UPDATE books
17 SET author = REPLACE (author, 'STEVEN', 'STEPHEN')
18 WHERE author LIKE '%FEUERSTEIN, STEVEN%';
19 END;
我们通过下面这个表仔细的分析一下这段代码。
1.3.2 控制和条件逻辑
PL/SQL提供了一套完整的语句我们可以紧密的控制程序执行哪一行代码。这些语句包括以下几项。
IF和CASE语句。
这些语句实现了条件逻辑,例如,“如果一本书的页数大于1000,则……”。
完整的循环及迭代控制。
包括FOR循环、WHILE循环以及简单循环。
GOTO语句。
是的,PL/SQL甚至还提供的GOTO语句,我们可以无条件地从程序的一部分转到另一部分。不过,这并不意味者我们就应该用它。
下面是一个过程(一个可以通过名字进行调用的可重用代码块)说明了这些特性。
1 PROCEDURE pay_out_balance (
2 account_id_in IN accounts.id%TYPE)
3 IS
4 l_balance_remaining NUMBER;
5 BEGIN
6 LOOP
7 l_balance_remaining := account_balance (account_id_in);
8
9 IF l_balance_remaining < 1000
10 THEN
11 EXIT;
12 ELSE
13 apply_balance (account_id_in, l_balance_remaining);
14 END IF;
15 END LOOP;
16 END pay_out_balance;
我们通过下面这个表详细地分析一下这个代码块。
1.3.3 出现错误了
PL/SQL语言同时为抛出错误和处理错误提供了强大的处理机制。在下面这个过程中,我更具ID获得某个账户的名字和余额,然后查看余额是否太少了;如果确实太少了,我就明确的抛出一个异常,终止程序继续操作。
1 PROCEDURE check_account (
2 account_id_in IN accounts.id%TYPE)
3 IS
4 l_balance_remaining NUMBER;
5 l_balance_below_minimum EXCEPTION;
6 l_account_name accounts.name%TYPE;
7 BEGIN
8 SELECT name
9 INTO l_account_name
10 FROM accounts
11 WHERE id = account_id_in;
12
13 l_balance_remaining := account_balance (account_id_in);
14
15 DBMS_OUTPUT.PUT_LINE (
16 'Balance for ' || l_account_name ||
17 ' = ' || l_balance_remaining);
18
19 IF l_balance_remaining < 1000
20 THEN
21 RAISE l_balance_below_minimum;
22 END IF;
23
24 EXCEPTION
25 WHEN NO_DATA_FOUND
26 THEN
27 -- No account found for this ID
28 log_error (...);
29
30 WHEN l_balance_below_minimum
31 THEN
32 log_error (...);
33 RAISE;
34 END;
我们用下面这个表详细的分析下这段代码中的错误处理方面:
这个错误处理部分针对的的是账户余额太少的错误(我这个应用程序特有的异常)。如果抛出的异常时l_balance_below_minimun,这个异常在这里被捕获,错误被记下来。然后,考虑到这个错误的严重性,我又一次把这个错误抛出去,把这个错误传出当前过程,传给调用它的PL/SQL块
第6章会带你充分了解PL/SQL的错误处理机制。
当然,关于PL/SQL还有许多可说─这也是为什么这本书有上千页的内容要学!不过,这些初始的例子应该能让你对将要用PL/SQL编写的代码有些感觉,包括一些最重要的语法元素,以及编写─读懂─PL/SQL代码的容易程度。