• LightDB中的存储过程(五)


    LightDB支持存储过程,除了支持Postgres的plpgsql存储过程,还兼容Oracle的存储过程,新增了plorasql过程语言。上一篇中我们介绍了存储过程中的动态SQL语句,这一篇主要讲述存储过程中的记录类型。

    什么是记录类型(Record)呢?

    记录类型时PL/SQL中的复合类型,内部组件可以具有不同的数据类型。可以简单理解为是C语言中的结构体。因此记录类型有着广泛的应用。复合数据类型时指包含内部组件的数据类型,可以参考LightDB中的复合类型这篇文章。

    PL/SQL支持两种复合数据类型:集合类型和记录类型。他们的区别是:集合类型中所有内部组件具有相同的数据类型,而记录类型内部组件可以具有不同的数据类型。集合类型后续文章会讲,本文主要讲述记录类型。

    记录类型的声明与使用

    可以使用RECORD语句在PL/SQL块中声明记录类型,该记录类型是局部的数据类型,只能在当前块中使用。如果记录类型是在独立子程序或包中声明的,则记录类型存储在数据库中。在包的规范中声明的记录类型是包的公共元素,可以在包外部以"packagename.typename"的形式引用。当删除包时,包中的记录也会被删除。

    好了,我们看一下如何声明一个记录类型,如何去使用记录类型。举个具体的例子:

    create or replace procedure shenlan
    as
    declare
    	type mytype is record (a int, b varchar(10));  -- 在存储过程中声明一个记录类型
    	v mytype;
    begin	
    	select id,name into v from mystudent where rownum < 2;
    	raise notice '%', v;
    end;
    /
    
    drop procedure shenlan;  -- 同时会删掉记录类型mytype、
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    当然,声明记录类型时也可以使用%TYPE,举个例子:

    create or replace procedure shenlan
    as
    declare
    	type mytype is record (a mystudent.id%TYPE, b mystudent.name%TYPE);  -- 在存储过程中声明一个记录类型
    	v mytype;
    begin	
    	select id,name into v from mystudent where rownum < 2;
    	raise notice '%', v;
    end;
    /
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    另外,实际使用中,还可以利用%ROWTYPE声明记录类型变量。可以通过%ROWTYPE声明与已知表、视图相一致的记录类型变量,该变量的各个字段的名称、顺序、数据类型与相应表、视图中列的名称、顺序、数据类型一致。举个例子:

    create or replace procedure shenlan
    as
    declare
    	v mystudent%ROWTYPE;  -- 利用%ROWTYPE声明记录类型变量
    begin	
    	select * into v from mystudent where rownum < 2;
    	raise notice '%', v.id;  -- 记录类型的使用
    end;
    /
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    记录类型还可以在INSERT语句中应用,举个示例如下:

    create or replace procedure shenlan
    as
    declare
    	v mystudent%ROWTYPE;  -- 利用%ROWTYPE声明记录类型变量
    begin	
    	select * into v from mystudent where rownum < 2;
    	v.id := 10000;
    	insert into mystudent values v;  -- 还可以这么用
    end;
    /
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    更多请参考LightDB官网

  • 相关阅读:
    Linux激活Linux系统中交换空间
    Java基础知识总结(超详细整理)三
    CleanMyMac X2023最新版安装图文详解
    计算机毕业设计(62)php小程序毕设作品之驾校考试小程序系统
    Jmix 中 REST API 的两种实现
    关于金融英文翻译,专业的翻译公司如何选择
    Docker Tomcat 搭建文件服务器
    神经网络模型训练简记(一)
    Linux--VMware的安装和Centos
    微服务-gateway【服务网关入门】
  • 原文地址:https://blog.csdn.net/s_lisheng/article/details/126116298