前言
本篇介绍下HaloDB中的ORALCE模式下如何自定义存储过程。另外,HaloDB 16 已经正式发布,如果对新版本感兴趣的朋友请移步 https://www.modb.pro/doc/132036 后续会推出HaloDB 16版本的解读。
广告时间:
如果有对我们的产品感兴趣的朋友可以通过主页的联系方式与我取得联系,获取license来安装体验,目前已经开通HaloDB吐槽群,欢迎来喷,进群请私聊我获取。
个人公众号:张某人的DBA菜谱**
一、简单聊聊DBMS包
在Oracle数据库系统中DBMS包起至关重要的作用,通常情况下DBMS(Database Management System)包并不是一个直接存在的独立包,但通常我们提到的与DBMS相关的功能或包,实际上是指Oracle提供的一系列用于数据库管理和操作的内置包和函数,这些包和函数极大地扩展了SQL和PL/SQL的能力,使得数据库管理员和开发者能够执行更复杂的任务,如性能监控、动态SQL执行、权限管理等。
通常最常见5个的DBMS包如下表所示:
| 序号 | 包名 | 作用 |
|---|---|---|
| 1 | DBMS_ALERT | DBMS_ALERT内置包提供了注册、发送和接收告警的能力。 |
| 2 | DBMS_ASSERT | DBMS_ASSERT内置包用于对输入值的属性进行验证。 |
| 3 | DBMS_OUTPUT | DBMS_OUTPUT内置包用于向消息缓冲区发送消息,或者从消息缓冲区获取消息。 |
| 4 | DBMS_PIPE | DBMS_PIPE内置包用于在连接到相同数据库集群的会话内部或者会话之间传递消息。 |
| 5 | DBMS_RANDOM | DBMS_RANDOM内置包提供了内建的随机数生成器 |
二、HaloDB中DBMS的兼容情况
2.1、DBMS_ALERT
DBMS_ASSERT内置包主要用于对输入值的属性进行验证,以确保输入值符合特定的规范或条件。这些验证功能对于提高数据库操作的安全性和稳定性至关重要。具体来说,DBMS_ASSERT内置包包含多个子程序,每个子程序都针对不同类型的输入值进行验证。相关参数内容参考下图

想在HaloDB中使用DBMS_ALERT首先要确保你的halo数据库处于ORACLE模式,打开方式可以参考前文Halo DB 14 小白零基础系列(17)–初探HaloDB的Oracle兼容性
示例1:
(1)HaloDB中查看DBMS_ALERT

(2)dbms_alert.register:注册一个预警事件
语法:DBMS_ALERT.REGISTER (name IN VARCHAR(30) );
halo0root=# exec dbms_alert.register('aldd');
CALL
(3)dbms_alert.remove:删除会话不需要的预警事件
halo0root=# exec dbms_alert.remove('aldd');
CALL
(4) dbms_alert.removeall:删除当前会话已注册所有预警事件
halo0root=# exec dbms_alert.removeall();
CALL
操作截图如下:

2.2、DBMS_ASSERT
DBMS_ASSERT 是 Oracle 数据库中提供的一个内置包,用于在 PL/SQL 程序中执行安全的字符串验证和清理。这个包主要被设计用来帮助防止 SQL 注入攻击和其他基于字符串的恶意活动。通过使用 DBMS_ASSERT 包中的函数,开发者可以确保输入的数据符合特定的规则,比如长度、格式等,从而增加应用程序的安全性。

示例2:

halo0root=# SELECT DBMS_ASSERT.ENQUOTE_LITERAL('HaloDB biogNB') FROM dual;
enquote_literal
-----------------
'HaloDB biogNB'
(1 row)
2.3、DBMS_OUTPUT
DBMS_OUTPUT是Oracle数据库中一个非常重要的程序包,它主要用于在PL/SQL程序或SQL*Plus命令中输出信息,帮助开发人员调试程序或查看分析结果。详情见下表:

示例3:
halo0root=# --dbms_output.enable:对过程的调用
halo0root=# call DBMS_OUTPUT.ENABLE ( );
CALL
halo0root=# --dbms_output.new_line :放置一个行尾标记
halo0root=# call DBMS_OUTPUT.NEW_LINE( );
CALL
halo0root=# --dbms_output.put :对在缓冲区中放置一条部分行
halo0root=# exec DBMS_OUTPUT.PUT ('halodb nb');
CALL
halo0root=# --dbms_output.put_line :在缓冲区中放置一条线
halo0root=# exec DBMS_OUTPUT.PUT_LINE ('halodb nb');
halodb nbhalodb nb
CALL

2.4、DBMS_PIPE
DBMS_PIPE是Oracle数据库中一个内置的程序包,它允许在同一数据库实例中的不同会话之间进行通信。DBMS_PIPE提供了创建管道、发送消息、接收消息、管理管道等一系列功能,类似于UNIX系统中的管道机制,但并非通过操作系统机制实现,而是将数据缓存在Oracle的系统全局区域(SGA)中。以下是关于DBMS_PIPE的详细介绍:

示例4:
halo0root=# --dbms_pipe.__list_pipes :获取所有命名管道的列表
halo0root=# select dbms_pipe.__list_pipes ();
__list_pipes
--------------
(0 rows)
halo0root=# select dbms_pipe.__unpack_message_bytea ();
__unpack_message_bytea
------------------------
(1 row)
halo0root=# select dbms_pipe.__unpack_message_date ();
__unpack_message_date
-----------------------
(1 row)
halo0root=# select dbms_pipe.__unpack_message_number ();
__unpack_message_number
-------------------------
(1 row)
halo0root=# select dbms_pipe.__unpack_message_record ();
__unpack_message_record
-------------------------
(1 row)
halo0root=# select dbms_pipe.__unpack_message_text ();
__unpack_message_text
-----------------------
(1 row)
halo0root=# select dbms_pipe.__unpack_message_timestamp();
__unpack_message_timestamp
----------------------------
(1 row)
halo0root=# --dbms_pipe.create_pipe:显式创建公共或专用管道
halo0root=# select dbms_pipe.create_pipe ('asas');
create_pipe
-------------
(1 row)
halo0root=# select DBMS_PIPE.NEXT_ITEM_TYPE ();
next_item_type
----------------
0
(1 row)
halo0root=# call DBMS_PIPE.PACK_MESSAGE('abc');
CALL
halo0root=# --dbms_pipe.purge:此过程清空命名管道的内容
halo0root=# call dbms_pipe.purge ('abc');
CALL


2.5、DBMS_RANDOM
DBMS_RANDOM包为开发者提供了一系列函数和过程,用于生成各种类型的随机数,包括整数、浮点数、字符串以及符合正态分布的随机数等。这些随机数可以用于多种场景,如测试、模拟、数据加密等。

示例5:
halo0root=# --dbms_random.random:将生成一个随机数
halo0root=# select dbms_random.random ();
random
-----------
282654944
(1 row)
halo0root=# --dbms_random.seed:将重置种子
halo0root=# call dbms_random.seed ('123');
CALL
halo0root=# select dbms_random.string ('p','200');
string
----------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------
bX_%,_NrnapHbS?"<4?=dl' JpG4lT)D^th`Fato%v3>y2Lw6JsltTl1Cw6]JR4'L''WE&"t?VetB`j KQk2sO3t"0mUA@5+Xnp$`0P 1XrNX#N{qd|v F+:C6^R(+a,4@ 5QO4
W)o(/}$uZH<fG|VTE if*J*2Z71BI{?jhiVH<n1K[?q5{6{;5NTWAoRWfY*`c&j}S
(1 row)
halo0root=# select dbms_random.string ('p','100');
string
------------------------------------------------------------------------------------------------------
[^{I**N^P`aD{ELYf/b%=6LHELoyt<>n#I=7]7Q?7CSG%+/L9V'p?o4W7sK]pGI|@KKAV,|?l#FC=a}ot-,rk#GvFEU3nzDNiQO=
(1 row)

最后
本期介绍了HaloDB中的DBMS包,虽然是慢工,但是不是什么细活,我们下期见。





