暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Halo数据库中如何玩转存储过程

贾桂权 2024-10-23
119

前言

  本篇介绍下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后重新登录,否则会出现如下好玩的事情:
64adcd73c43737c25fc705228b0eb80.png
这个问题已经提交研发排期处理。

环境验证:
image.png

(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 表中查找匹配的课程描述,并返回该描述。如果找不到对应的数据,或者在执行过程中遇到其他异常,函数会返回预定义的错误消息。
执行结果截图如下:
104f28cc025a3f6b989c6b809220d61.png

示例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;
/

image.png

(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;

截图如下:
a2fae60a92f1a9b166de62d1e9cf96f.png

三、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中执行结果如下:
cca3ce561e8fa84b006d0675a2b3c4e.png
最后:
   后面我们继续介绍Halo数据库中如何玩转PL/SQL,也感谢大家继续关注我们Halo数据库。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论