专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

PL/SQL 杂谈(二)(pl/sql developer使用)

ins518 2025-07-10 15:34:14 技术文章 5 ℃ 0 评论

承接(一)部分。我们从结构和功能这两个方面展示PL/SQL的关键要素。可以看看 PL/SQL 的优雅的代码。写出一个好的代码,就和文科生写出一篇优秀的作文一样,那么赏心悦目。

1、与SQL的集成

PL/SQL的一个最重要的表现就是和SQL的紧密集成。我们不必依赖其他中间软件作为胶水去运行PL/SQL中的SQL语句,比如ODBC(开放数据库连接)或JDBC(JAVA数据库连接),相反我们只需在代码中插入 update 或 select 语句,看看下面这个匿名块:

declare

l_book_count integer;---定义一个计数书本数量的变量,integer 数据类型

------

begin

select count(*)

into l_book_count

from books

where author like '%张飞%';

/*以上这部分是将从数据表 BOOKS 查询到作者为张飞的书本数量计数,存入到变量 l_book_count*/

dbms_output.put_line('张飞写了'||l_book_count|| ' 书本。');

-----以上是在屏幕上输出“张飞写了多少书本。”

Update books

set author=replace(author,'张飞','关羽')

where author like '%张飞%';

---以上是将所有作者名是张飞的书本,都改成关羽。用的是 REPLACE 函数。

end;

2、控制和条件逻辑

(1)if 和 case 语句

他们进行逻辑条件判断,例如 如果一本书的页数大于1000,则需要干什么。在这里,我个人更倾向于写 CASE WHEN 语句,特别是多层嵌套的情况。当然 IF 和 CASE WHEN 是可以相互嵌套的。

(2)一个完整的循环或者迭代控制

包括 For 循环 ,while 循环以及简单 loop 循环

(3)goto 语句

PL/SQL提供了这个语句,使得我们可以无条件将执行跳转到程序的另一个部分。但是,说实话,大多数 ORACLE 的专家都是非常不推荐使用这个语句。在实际编码,我也很少见到有人会使用这个语句。

下面的这个存储过程(一个可以根据名字被调用,可以重复使用的代码块),演示了前面提到的一些特性,大家可以在自己电脑上新建一个表 accounts ,当然要有account_id_in字段。运行之后,可以测试调用结果。代码很简单,一眼就明:

CREATE OR REPLACE PROCEDURE pay_out_balance (

account_id_in IN accounts.id%TYPE)

IS

l_balance_remaining NUMBER;

BEGIN

LOOP

l_balance_remaining := account_balance (account_id_in);

IF l_balance_remaining < 1000

THEN

EXIT;

ELSE

apply_balance (account_id_in, l_balance_remaining);

---如果自己没有这个过程,可以用屏幕输出代替来测试

END IF;

END LOOP;

END pay_out_balance;

3、出错处理

无论是发现错误还是处理错误,PL/SQL都有一个强大的机制。下面我们根据账户ID获得一个账户的名称和余额,随后判断余额是否过少,如果过少,就要显式引发异常,终止过程的继续执行:

CREATE OR REPLACE PROCEDURE check_account (

account_id_in IN accounts.id%TYPE

)

IS

l_balance_remaining NUMBER;

l_balance_below_minimum EXCEPTION;

l_account_name accounts.name%TYPE;

BEGIN

-- 根据账户 ID 查询账户名称

SELECT name

INTO l_account_name

FROM accounts

WHERE id = account_id_in;

-- 调用 account_balance 函数获取账户余额

l_balance_remaining := account_balance(account_id_in);

-- 输出账户名称和余额信息

DBMS_OUTPUT.PUT_LINE(

'Balance for ' || l_account_name ||

' = ' || l_balance_remaining

);

-- 检查账户余额是否低于 1000

IF l_balance_remaining < 1000 THEN

-- 若低于 1000,抛出自定义异常

RAISE l_balance_below_minimum;

END IF;

EXCEPTION

-- 处理未找到账户的情况

WHEN NO_DATA_FOUND THEN

-- 调用 log_error 函数记录错误信息,这里假设传入账户 ID 和错误信息

log_error(account_id_in, 'No account found for this ID');

-- 重新抛出异常

RAISE;

-- 处理账户余额低于 1000 的情况

WHEN l_balance_below_minimum THEN

-- 调用 log_error 函数记录错误信息,传入账户 ID 和余额信息

log_error(account_id_in, 'Account balance is below 1000');

-- 抛出系统预定义的 VALUE_ERROR 异常

RAISE VALUE_ERROR;

END;

以上的例子可以看出 PL./SQL 的结构和功能。代码简单,逻辑清楚,是不是觉得就好像写出了一篇很有成就感的作文。但是我负责任的说,PL/SQL 是一种易学难精的语言,越往后,你就觉得自己脑子不够用。但是对于我来说,是一种享受。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表