前言
本篇介绍下HaloDB中的ORALCE模式下PLSQ/SQL如何使用。
广告时间:
HaloDB业内首次创造性的提出插件式内核架构设计,通过配置的方式,适配不同的应用场景,打造全场景覆盖的能力,满足企业大部分数据存储处理需求。从而消除数据孤岛,降低系统复杂度,保护企业既有投资,降低企业成本。同时支持x86、arm等异构平台之间的混合部署。
如果有对我们的产品感兴趣的朋友可以通过主页的联系方式与我取得联系,获取license来安装体验,目前已经开通HaloDB吐槽群,欢迎来喷,进群请私聊我获取。
一、什么是PL/SQL
PL/SQL是Oracle数据库的过程化语言扩展,它允许开发者将SQL语句、控制结构(如条件语句和循环)以及过程化代码(如变量声明和异常处理)组合成强大的数据库应用程序单元。它增强了SQL的编程能力,支持复杂的数据操作和业务逻辑实现,使得在Oracle数据库上进行应用开发变得更加高效和灵活。简而言之,PL/SQL是Oracle特有的编程语言,用于编写数据库存储过程、函数、触发器、包等数据库对象。在我们的日常工作中,会有大量的场景去使用PL/SQL。所以掌握PL/SQL也是DBA的基本技能。随着国产化的进程,我们HaloDB在这方面做了大量的工作,本篇为大家介绍下如何在HaloDB中像使用ORACLE一样完美玩转PL/SQL。
二 、创建与使用存储函数:
(1)在Halo中使用PL/SQL的前提条件
a、数据库参数database_compat_mode已设置为oracle
b、数据库参数standard_parserengine_auxiliary已设置为on
c、aux_oracle扩展已安装
d、数据库服务已重新启动
注意:在重启后最好 set search_path user public,或者登出hsql后重新登录,否则会出现如下好玩的事情:
这个问题已经提交研发排期处理。
环境验证:
(2)HaloDB中如何创建与使用存储函数:
示例1:
CREATE OR REPLACE FUNCTION show_description
(i_course_no course.course_no%TYPE)
RETURN varchar2
AS
v_description varchar2(50);
BEGIN
SELECT description
INTO v_description
FROM course
where course_no = i_course_no;
RETURN v_description;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
RETURN('The Course is not the database');
WHEN OTHERS
THEN
RETURN('Error in running show_description');
END;
/
DECLARE
v_description VARCHAR2(50);
BEGIN
v_description := show_description(1000);
DBMS_OUTPUT.PUT_LINE(v_description);
END;
/
-- 执行查询结果如下:
halo0root=# select show_description(10);
show_description
---------------------
Technology Concepts
(1 row)
上面的PL/SQL定义了一个show_description 的函数,该函数接收一个参数 i_course_no,此参数的类型与表 course 中的 course_no 字段的类型相同。函数的目标是从 course 表中查找匹配的课程描述,并返回该描述。如果找不到对应的数据,或者在执行过程中遇到其他异常,函数会返回预定义的错误消息。
执行结果截图如下:
示例2:
CREATE OR REPLACE FUNCTION id_is_good
(i_student_id IN NUMBER)
RETURN BOOLEAN
AS
v_id_cnt NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_id_cnt
FROM student
where student_id=i_student_id;
RETURN 1=v_id_cnt;
EXCEPTION
WHEN OTHERS
THEN
RETURN FALSE;
END id_is_good;
/
DECLARE
V_id number;
BEGIN
V_id := 102;
IF id_is_good(v_id)
THEN
DBMS_OUTPUT.PUT_LINE
('Student ID: '||v_id||' is a valid.');
ELSE
DBMS_OUTPUT.PUT_LINE
('Student ID: '||v_id||' is not valid.');
END IF;
END;
/

(3)HaloDB中如何实现SQL调用与编写复杂函数:
示例1:
halo0root=# create sequence INSTRUCTOR_ID_SEQ increment by 1 start with 1;
_instid
FROM dual;
RETURN v_new_instid;
EXCEPTION
WHEN OTHERS
THEN
DECLARE
v_sqlerrm VARCHAR2(250) := SUBSTR(SQLERRM,1,250);
BEGIN
RAISE_APPLICATION_ERROR(-20003,'Error in instructor_id: '||v_sqlerrm);
END;
END new_instructor_id;
/CREATE SEQUENCE
halo0root=# CREATE OR REPLACE FUNCTION new_instructor_id
halo0root-# RETURN instructor.instructor_id%TYPE
halo0root-# AS
halo0root$# v_new_instid instructor.instructor_id%TYPE;
halo0root$# BEGIN
halo0root$# SELECT INSTRUCTOR_ID_SEQ.NEXTVAL
halo0root$# INTO v_new_instid
halo0root$# FROM dual;
halo0root$# RETURN v_new_instid;
halo0root$# EXCEPTION
halo0root$# WHEN OTHERS
halo0root$# THEN
halo0root$# DECLARE
halo0root$# v_sqlerrm VARCHAR2(250) := SUBSTR(SQLERRM,1,250);
halo0root$# BEGIN
halo0root$# RAISE_APPLICATION_ERROR(-20003,'Error in instructor_id: '||v_sqlerrm);
halo0root$# END;
halo0root$# END new_instructor_id;
halo0root$# /
CREATE FUNCTION
-- 查询SQL执行结果
halo0root$# select new_instructor_id() from dual;
截图如下:
三、HaloDB中如何使用嵌套函数:
数据库中的嵌套函数就像是俄罗斯套娃游戏,一个娃娃里面还藏着更小的娃娃。同样的道理,在数据库中,一个函数可以调用另一个函数,甚至可以在一个函数的内部定义并使用一个新的函数,这就形成了所谓的“嵌套函数”。或者我们用一句话来说明嵌套函数的话就是:数据库中的嵌套函数就是让一个函数能够包含和调用其他函数,以此来构建更加复杂和高效的数据处理流程。那如何在HaloDB中实现这样的功能,我们接着往下看,我用一个示例来说明。
示例1:
CREATE OR REPLACE FUNCTION fx()
return integer
as
v_int integer := 255;
FUNCTION square
return number
as
declare
original_sequared number;
begin
original_sequared := v_int -10;
return 2*original_sequared;
end;
begin
v_int := square;
return v_int;
end;
/
上面的PL/SQL是定义了一个外部函数 fx(),其中包含一个内部函数 square()。当 fx() 被调用时,它通过 square() 函数对初始值进行操作,然后返回修改后的值。在这个例子中,square() 函数接收 fx() 中的 v_int 变量作为输入,对其进行减法和乘法运算,并将结果返回给 fx(),最终由 fx() 返回这个结果。
在HaloDB中执行结果如下:
最后:
后面我们继续介绍Halo数据库中如何玩转PL/SQL,也感谢大家继续关注我们Halo数据库。




