网站首页 > 技术文章 正文
承接(一)部分。我们从结构和功能这两个方面展示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 是一种易学难精的语言,越往后,你就觉得自己脑子不够用。但是对于我来说,是一种享受。
猜你喜欢
- 2025-07-10 一文搞懂JAVA 中的引用(java中的引用是什么)
- 2025-07-10 「分布式技术专题」数据库常见的JOIN算法
- 2025-07-10 Oracle 19c OCP考几科(oracle ocp考试时间)
- 2025-07-10 LLM已能自我更新权重,自适应、知识整合能力大幅提升,AI醒了?
- 2024-10-18 Oracle在plsql中创建表类型数据 oracle plsql创建表空间
- 2024-10-18 MyBatis项目实战 快速将MySQL转换成Oracle语句
- 2024-10-18 Oracle入门篇(3) oracle基础入门
- 2024-10-18 优化体系--oracle数据库I/0等待事件优化
- 2024-10-18 一文搞懂各种数据库SQL执行计划:MySQL、Oracle等
- 2024-10-18 Oracle中动态SQL详解(EXECUTE IMMEDIATE)
你 发表评论:
欢迎- 07-10Oracle 与 Google Cloud 携手大幅扩展多云服务
- 07-10分享收藏的 oracle 11.2.0.4各平台的下载地址
- 07-10Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
- 07-10Oracle Database@Azure 推进到南美等新区域并增加了新服务
- 07-10Oracle宣布推出 Oracle Database@AWS 的有限预览版
- 07-10Oracle与Nextcloud合作,推出主权云上的安全协作平台
- 07-10NodeRED魔改版连接MsSql、PostgreSQL、MySQL、OracleDB存储无忧
- 07-10对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 600℃几个Oracle空值处理函数 oracle处理null值的函数
- 592℃Oracle分析函数之Lag和Lead()使用
- 580℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 576℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 572℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 565℃【数据统计分析】详解Oracle分组函数之CUBE
- 551℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 546℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- Oracle 与 Google Cloud 携手大幅扩展多云服务
- 分享收藏的 oracle 11.2.0.4各平台的下载地址
- Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
- Oracle Database@Azure 推进到南美等新区域并增加了新服务
- Oracle宣布推出 Oracle Database@AWS 的有限预览版
- Oracle与Nextcloud合作,推出主权云上的安全协作平台
- NodeRED魔改版连接MsSql、PostgreSQL、MySQL、OracleDB存储无忧
- 对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 解读丨《归档文件整理规则》— 电子文件元数据存储
- Data Guard跳归档恢复的实践(dataguard failover)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (57)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)