IvorySQL功能点介绍--Package(包)

国产服务器上编译安装ivorysql开源数据库(简约) aarch架构+KylinV10 sp1系统,源码编译安装ivorysql 阅读详情

概述

IvorySQL 是一个开源项目,该项目的核心目标之一是提供 oracle 兼容功能,以便在 IvorySQL 数据库服务器上使用 oracle 代码。

在 PostgreSQL 之上提供 Oracle 兼容是一项多维任务。 从提供与 Oracle 兼容的 SQL 语法到添加对 PostgreSQL 中缺失或行为不同的数据类型的支持。 Oracle 兼容性的主要核心之一是在 PostgreSQL 中提供兼容的过程语言PL(procedural language),它在功能和语法上与 Oracle 的 PL/SQL 兼容。 

为此,IvorySQL 添加了一种新的 PL 语言 PL/iSQL,它接受、理解和执行 PL/SQL 语法。 如您所知,Oracle PL/SQL 的核心特性之一是 PACKAGES(包)。Package(包)是 Oracle 中的一个模式对象,它包含一组相关功能的定义,是 Oracle 使用最广泛的特性之一。

因此,本文将介绍Package(包),并举例说明如何用 IvorySQL 创建、使用和销毁 Oracle 样式的包。

包(Package)

那么什么是Package(包)? 包是 PL/iSQL 代码的分组,按逻辑程序单元划分。 换句话说,一个包可以被认为是相关函数、过程、变量或游标的集合,这个集合可以通过通用公共名称来访问。

IvorySQL 内置PL/iSQL语言,可以接受、理解和执行PL/SQL代码。包使用相同的语言,并且有两个主要组件。

  • 包规范(Specification)

    包规范列出了可以从包外部访问的所有项目,例如函数、过程、变量和游标。这也称为公共规范。

  • 包体(Body)

    包体包含包规范中列出的所有函数和过程的实现。除此之外,它还可以实现更多的功能、过程或其他元素。

这些不在包规范中的元素将被视为包的私有成员,并且只能在包内引用它们。 不允许外部访问。

包体也可以有一个特殊的代码块,称为初始化块。 这是一个特殊的块,因为这个块在每个会话中只执行一次,在包第一次被访问的最开始。

让我们看一些代码示例,看看包是如何运行的。

示例

通用示例

首先让我们设置兼容模式,这样我们就可以访问 IvorysSQL数据库中可用的 Oracle 兼容特性。

SET compatible_mode TO oracle;

CREATE TABLE books (
    id     INT, 
    title  VARCHAR2(100), 
    author VARCHAR2(100),
    price  NUMBER);
INSERT INTO books VALUES (10, 'The Hobbit', 'J. R. R. Tolkien', 10.0);
INSERT INTO books VALUES (11, 'Winnie-the-Pooh', 'A. A. Milne', 5.0);
INSERT INTO books VALUES (12, 'Peter Pan', 'James Matthew Barrie', 4.0);
INSERT INTO books VALUES (13, 'Charlie and the Chocolate Factory', 'Roald Dahl', 5.0);
INSERT INTO books VALUES (14, 'SThe Jungle Book', 'Rudyard Kipling', 9.0);
INSERT INTO books VALUES (15, 'The Little White Bird', 'James Matthew Barrie', 3.0);

让我们来创建一个简单的包。这个包声明了一个游标来列出所有可用的图书,并包含一些子程序来列出、添加和删除书籍。同时,它还声明了一些私有变量来计数和保存图书信息。

CREATE OR REPLACE PACKAGE mybooks AS
    CURSOR      booksinfo IS SELECT * from BOOKS;

    PROCEDURE list_books;
    FUNCTION add_book(title VARCHAR2(100), author VARCHAR2(100), 
         price NUMBER) RETURN bool;
    PROCEDURE remove_book(book_title VARCHAR2(100));
END;
ivorysql$# /
CREATE PACKAGE
CREATE OR REPLACE PACKAGE BODY mybooks AS

    -- declare private variables
    bookinfo    booksinfo%rowtype; 
    books_count INT;

    PROCEDURE list_books AS
    BEGIN
        OPEN booksinfo;
        RAISE INFO 'Book Info:';
        RAISE INFO '';
        LOOP
            FETCH booksinfo into bookinfo;
            EXIT WHEN NOT FOUND;

            RAISE INFO '  Name    = %', bookinfo.title;
            RAISE INFO '  Author  = %', bookinfo.author;
            RAISE INFO '  Price   = %', bookinfo.price;
            RAISE INFO '------------------------------';
        END LOOP;
        RAISE INFO 'Total Books   = %', books_count;
        CLOSE booksinfo;
    END;

    FUNCTION add_book(title VARCHAR2(100), author VARCHAR2(100),
        price NUMBER) RETURN bool AS
    BEGIN
        INSERT INTO BOOKS VALUES (
            books_count + 1,
            title,
            author,
            price);
        
        books_count := books_count + 1;
        RETURN true;

        EXCEPTION WHEN OTHERS THEN
            RETURN false;
    END;

    PROCEDURE remove_book(book_title VARCHAR2(100)) AS
    BEGIN
        DELETE FROM BOOKS WHERE title = book_title;

        EXCEPTION WHEN OTHERS THEN
            RAISE INFO 'Book % not found', book_title;
    END;

-- initializer block
BEGIN           
    books_count := 0;
    SELECT count(*) INTO books_count
        FROM BOOKS;
END;
ivorysql$# /
CREATE PACKAGE BODY

让我们检验这些数据。这匿名块试图访问该包的私有成员,这将会导致错误。

ivorysql=# DECLARE
ivorysql$#   nbooks int := 0;
ivorysql$# BEGIN
ivorysql$#     nbooks := mybooks.books_count;
ivorysql$#     RAISE INFO 'Total Books   = %', nbooks;
ivorysql$# END;
ivorysql$# /
2022-05-26 16:35:32.328 PKT [63554] ERROR:  package private variable ("mybooks.books_count") is not accessible

让我们使用包的子程序列出所有可用的书籍。 list_books   mybooks

ivorysql=# BEGIN
ivorysql$#     mybooks.list_books;
ivorysql$# END;
ivorysql$# /
INFO:  Book Info:
INFO:  
INFO:    Name    = The Hobbit
INFO:    Author  = J. R. R. Tolkien
INFO:    Price   = 10
INFO:  ------------------------------
INFO:    Name    = Winnie-the-Pooh
INFO:    Author  = A. A. Milne
INFO:    Price   = 3
....
....
INFO:  Total Books   = 6
DO
ivorysql=#

让我们使用包的子程序添加一本新书。 add_book  mybooks 

DECLARE
  added bool;
BEGIN
    added := mybooks.add_book('The Cat in the Hat', 'Dr. Seuss', 10);
    IF added = TRUE THEN
        RAISE INFO 'new book added';
    END IF;
END;
/

删除包

可以使用以下命令删除包体或完成包:

  • DROP PACKAGE BODY [package name]

ivorysql=# DROP PACKAGE BODY mybooks;
DROP PACKAGE BODY
  • DROP PACKAGE [package name]

ivorysql=# DROP PACKAGE mybooks;
DROP PACKAGE

具有不同权限的包调用

我们将创建两个具有调用者和定义者权限的包,并查看结果以了解它们之间的区别。

ivorysql=> SELECT current_user;
 current_user 
--------------
 ivorysql
(1 row)

--创建具有INVOKER权限的包

CREATE OR REPLACE PACKAGE pkg_invrights AUTHID CURRENT_USER AS
    PROCEDURE curr_user;
END;
/

CREATE OR REPLACE PACKAGE BODY pkg_invrights AS
    PROCEDURE curr_user AS
    BEGIN
        RAISE INFO 'Current User: %', current_user;
    END;
END;
/

--创建一个具有DEFINER权限的包

CREATE OR REPLACE PACKAGE pkg_defrights AUTHID DEFINER AS
    PROCEDURE curr_user;
END;
/

CREATE OR REPLACE PACKAGE BODY pkg_defrights AS
    PROCEDURE curr_user AS
    BEGIN
        RAISE INFO 'Current User: %', current_user;
    END;
END;
/

让我们先查看具有调用程序权限的包。

ivorysql=> CALL pkg_invrights.curr_user;
INFO:  Current User: ivorysql
CALL

让我们来看看具有定义权限的包。

ivorysql=> CALL pkg_defrights.curr_user;
INFO:  Current User: ivorysql
CALL

让我们切换到另一个名为ivuser的用户。

ivorysql=> \c ivorysql ivuser;
You are now connected to database "ivorysql" as user "ivuser".

让我们先看看具有调用程序权限的包。

ivorysql=> CALL pkg_invrights.curr_user;
INFO:  Current User: ivuser
CALL

让我们看看具有定义权限的包。

ivorysql=> CALL pkg_defrights.curr_user;
INFO:  Current User: ivorysql
CALL

总结

如上所示,当调用具有调用者权限(pkg_invrights)的包时,它使用的是调用该包的用户的特权。但是,当调用(pkg_defrights)时,它仍然使用包所有者的特权。

IvorySQL内核的Serverless数据库——HGNeon适配国内云对象存储 🐘我们基于Neon的项目开源的核心部分,提供了部署脚本和k8s manifest,开发了proxy一写多读模式,丰富了REST API接口,适配了国内主流云厂商的对象存储,形成HGNeon产品。接下来,我们来验证一下用国内云厂商的云存储服务支撑HGNeon的存储部分,效果如何?存储节点启动完成后,启动第一个计算节点,启动后有1个pod、3个service、1个deployment。2.准备阿里云账号,开通OSS服务,创建一个桶(Bucket),创建账号ak、sk,授权OSS。 阅读详情

相关推荐

零基础玩转华为AP 4050DN-HD:FAT模式家庭无线网络配置实战

本文为零基础用户提供华为AP 4050DN-HD从FIT模式转换为FAT模式的完整实战教程。详细介绍了固件升级、模式转换以及配置家庭无线网络(包括路由、DHCP、Wi-Fi和NAT)的每一步操作,帮助用户将企业级瘦AP改造为高性能家庭胖AP,打造稳定可靠的家庭网络环境。

weixin_29196613的博客 635

postgresql用事件触发器来提示命令的执行信息

create or replace function fun_event_trigger() returns event_trigger as declareveventtuplerecord;beginraiseinfo′eventtriggerfunctioncalld′;forveventtupleinselect∗frompgeventtriggerddlcommands()loopraiseinfo′tag[endloop;end declare v_event_tuple record; b

weixin_41561946的博客 650

DIY玩家必备:用SSS1623芯片打造高性价比USB麦克风(附完整电路图)

本文详细介绍了如何利用SSS1623芯片DIY高性价比USB麦克风,包括元件选型、电路设计、PCB布局及调试技巧。通过完整的电路参考设计和实用建议,帮助电子爱好者打造专业级录音设备,实现免驱动即插即用功能。

weixin_29166013的博客 239

python开发总结五

不知觉python总结都有四十页了,虽然可能很多都是基础性的,仍然有成就感。和之前一样,仍然全部贴出来,而不是把新的贴出来,请谅解。这次新增的部分包括c扩展,排序,ftp,源码安全,性能,代码检查等。后面在python上努力的几个方向:1、继续在开发中多使用,积累开发经验。2、针对我们公司完善基础库,在我们公司推广。3、抽时间,系统学习一下python。4、学习一下高手在怎么使用python。毕竟

常高伟的专栏 3892

【MM小贴士】关于SAP系统中关税的处理方式

的运费,这部分来讲,我们关税的计价基础,就应该是货物价值+包邮到中国港口的运费,完后进行报关操作,缴纳关税,后半段从中国港口拉回到企业里面的运输费,就会做到费用里面去,而不是计入到存货成本。1、我们自己的企业和国外厂家A购买一项物资,厂家A的报价会分成几个组成部分货物本身的价值或者货物本身的价值+到国外港口的运费或者货物本身的价值+到中国港口的运费或者货物本身的价值+包邮到你们自己企业的整体运费。所以我的关税就是不确定的。重点是运费是哪一段的运费,如何结算,结算的货币,何时能够确定运费。.........

竹大的博客 9029

Tessy集成测试,看完这篇就够了

本文详细介绍了集成测试模块的创建与测试流程。首先,通过TESSY模块进行组件测试管理,设置测试环境并配置相关函数,包括外部函数和组件函数的处理。接着,设计测试用例,包括设置工作任务、增加测试用例、为测试场景添加函数及赋值,并执行测试用例。此外,文章还介绍了集成测试覆盖率的概念,包括CPC(调用对覆盖率)和FC(函数覆盖率)的定义与作用,强调了它们在确保测试充分性和发现潜在问题中的重要性。最后,提到了数据共享的注意事项,指出在测试过程中全局变量的共享特性及桩函数调用的处理方式。

qq_37282365的博客 1097

IvorySQL系列:初始IvorySQL 3.0 在CentOS 7.9下源码安装及不同兼容模式验证测试

IvorySQL项目最初由瀚高公司发起,基于流行的PostgreSQL分支,发展成了一个遵循Apache 2.0开源协议的项目。截至到2024年1月,最新版本为IvorySQL Release 3.0 beta版。与PostgreSQL完全兼容,并且还集成了一些独特特性,这种融合让其在保持兼容性的同时增加了更多的功能。IvorySQL社区对于与PostgreSQL的兼容性非常重视,并且承诺可以直接替代最新版本的PostgreSQL。

shlei5580的专栏 1625

Unlocking Decoding-time Controllability: Gradient-FreeMulti-Objective Alignment with Contrastive Pr

将基于庞大网络语料库训练的大型语言模型(LLMs)(OpenAI,2023;Touvron 等,2023;Google,2023)与人类偏好对齐,是减少产生不安全(Wei 等,2023)、幻觉(Zhang 等,2023b)和有偏见(Gallegos 等,2023)内容的重要一步。随着偏好学习技术(如 PPO(Schulman 等,2017)、DPO(Rafailov 等,2023)及其他变体(Azar 等,2023;Ethayarajh 等,2024;

qq_52053775的博客 1169

IvorySQL 4.0 之兼容 Oracle 包功能设计思路解读

以上就是实现兼容 Oracle 包功能时的设计思路。通过包的形式将相关的功能模块化,使得数据库的过程、函数、变量和其他编程元素组织在一起形成自包含单元,便于管理和维护。由于实现细节隐藏在包体中,提高了代码的安全性和可维护性。包体中的代码在第一次调用时被加载到内存中,后续调用可以直接使用,减少了解析和加载时间。本文由博客一文多发平台OpenWrite发布!

IvorySQL的博客 948

某物data魔改与变种算法还原(含加解密Py纯算)

某物data加解密、设备指纹魔改、变异、自定义加密分析与纯算还原

吴秋霖的博客 1283

i.MX6ULL驱动开发 | 31 - Linux内核网络设备驱动框架

net_device结构体在内核中指代一个网络设备,定义在,是一个非常大的结构体,包含网络设备的属性描述和操作接口,其中一些关键的成员如下。Linux在轮询处理机制和中断处理机制的基础上,提出了一种高效的网络处理技术NAPI。NAPI的核心思想是不全部采用中断来读取网络数据,而是采用中断来唤醒数据接收服务程序,在接收服务程序中采用poll的方法来轮询处理数据。提高短数据包的接收效率,减少中断处理的时间。...

Mculover666的博客(嵌入式) 1104

为IvorySQL增添PACKAGE语法帮助

而从meson.build看是make的时候才生成这两个文件的,并且是使用create_help.pl读取文档目录@SOURCE_ROOT@/doc/src/sgml/ref中的所有语法文档生成的。psql的语法帮助文档挺好用的,本次给IvorySQL-4.6适配create package(body)语法帮助文档算是比较系统的了解了下语法帮助文档的原理。仿照create_table.sgml或其他文件,生成create_package.sgml和create_package_body.sgml文件。

IvorySQL的博客 866

BACnet协议栈基本对象BI、BO、AI、AO、AV以及device和File对象介绍

BACnet协议栈基本对象BI、BO、AI、AO、AV以及device和File对象介绍

shufawangzhang的博客 3988

IvorySQL 4.0 发布:全面支持 PostgreSQL 17

🔥IvorySQL 开源社区小伙伴们,大家好,IvorySQL 开源社区今天激动的向大家宣布:IvorySQL 4.0 发布了!这是 2024 年以来发布的最新版本,相较于上个版本,有了较大的变化。该版本有多项增强:全面支持 PostgreSQL 17,新增和完善多种 Oracle 兼容特性,如不可见列特性和包功能等。下面将会为大家详细解读。

【优快云】 1036

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IvorySQL 西安站活动回顾|一键了解IvorySQL新兼容性

pgvector作为PostgreSQL的重要扩展,以其卓越的向量计算能力著称,支持高达16000维度的向量计算能力,使得PostgreSQL能够直接转化为高效的向量数据库。IvorySQL是基于PostgreSQL开发,因此它同样支持添加pgvector扩展。9月7日,IvorySQL社区携手中国开源软件联盟PostgreSQL分会,在古都西安成功举办PostgreSQL技术峰会及IvorySQL西安用户组成立仪式,现场吸引了众多西安PG圈技术爱好者和资深开发小伙伴们的热情参与!

IvorySQL的博客 598

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Oracle 迁到 IvorySQL,到底能少改多少代码?我实测了一遍

本文作者:施嘉伟,12 年数据库从业经验,Oracle ACE Pro、PostgreSQL ACE,OCM/PGCM/KCM 认证。IvorySQL 专家顾问委员、KVA、崖山 YVP、KWDB MVP、PolarDB 开源社区/HaloDB 技术顾问、TiDB 社区技术布道师、青学会 MOP 技术社区专家顾问。去 O 的项目一旦进入实施阶段,团队问的问题就变得很具体:原来的 SQL 还能不能跑?PL/SQL 要改多少?客户端要不要换?事务语义会不会变?

IvorySQL的博客 488

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Centos7 被停用!如何利用 Ora2Pg 将 Oracle 迁移至 IvorySQL?

在评估过程中,Ora2Pg会检查所有数据库对象,所有函数和存储过程,以检测是否仍有一些对象和PL / SQL代码无法由Ora2Pg自动转换,最终,通过内容分析模式,生成有关Oracle数据库包含的内容和无法导出的内容的文本报告。根据自己Oracle数据库信息,在ora2pg.conf修改信息,包括host,sid,port,用户名、密码,SCHEMA等,如下图所示。在IvorySQL中,查看迁移的Table,View并测试Procedure,Function,均获得到正确结果。导出成功后,将产生如下文件。

IvorySQL的博客 1335

深度拆解 IvorySQL 去 O 核心解决方案

本文整理于 HOW 2026 矫顺田演讲内容。

IvorySQL的博客 362

IvorySQL 深度解析:融合 PostgreSQL 生态与 Oracle 兼容性的革新之路

它不仅降低了迁移的门槛和风险,更重要的是,它将 Oracle 的强大与 PostgreSQL 的灵活结合在了一起,为用户在未来的数据结构、混合多模态数据处理上提供了无限的想象空间。在当今多元化的数据库技术栈中,企业常常面临一个两难选择:是拥抱开源、生态丰富、性能卓越的 PostgreSQL,还是沿用商业强大、生态成熟但成本高昂的 Oracle 数据库?IvorySQL 不仅仅是一个基于 PostgreSQL 的再发行版,它是一个思考深、设计巧、价值高的开源数据库项目。

IvorySQL的博客 461

基于PostgreSQL的最新分支--IvorySQL 1.2 正式加入优快云

当全世界都在收拾行囊,准备迎接新的一年时,我们仍在努力工作,为我们团队从2021年初开始就一直在做的项目做最后的努力。2021年12月15日,就在那天结束前,我们所有测试顺利通过,在整理桌面之前,我们悄悄发布了IvorySQL的第一个版本。 经过不断的探索与研发、夜以继日的反复测试。我们的IvorySQL 1.2版本也与大家正式见面啦。 我们是谁: IvorySQL是基于PostgreSQL的衍生开源项目,它是一款100%兼容原生PostgreSQL,并与最新版本内核同步且具备强大Oracl.

IvorySQL的博客 577

IvorySQL 5.0 发布:基于 PG 18.0,Oracle 兼容、生态组件、云原生与易用性全面进化!

IvorySQL 开源社区小伙伴们,大家好,IvorySQL 开源社区今天激动的向大家宣布:IvorySQL 5.0 发布了!IvorySQL 5.0 基于 PostgreSQL 18.0 全面升级:Oracle 兼容性再突破,生态组件集成再升级,云原生深度支持,配合全平台安装包与在线丝滑体验,让复杂变得简单。

IvorySQL的博客 537

Oracle 为什么能跑在 PostgreSQL 上?答案藏在这套内核里

IvorySQL 对 PG 生态的贡献,在于给 PostgreSQL 生态加上了一条面向 Oracle 存量系统迁移的内核级路径。企业系统里,Oracle 往往不是一个单纯的数据存储。大量业务逻辑、权限习惯、报表工具、运维脚本、数据字典查询、存储过程和包都围绕 Oracle 建了很多年。IvorySQL 把 parser、类型、Package、PL/iSQL、系统视图、内置函数、会话语义这些迁移难点放到数据库侧处理,本质上是在降低企业拥抱 PG 生态的门槛。

IvorySQL的博客 347

第二期 Good First Issue 来啦!第一期迎来 4 位新贡献者,下一张证书会是你的吗?

前不久,我们发起了第一期 Good First Issue 活动,整理了 10 个新手友好任务。说实话,一开始我们也有点忐忑——真的会有人来认领吗?结果超出预期。最终,,迎来了;另外还有。恭喜以上小伙伴!已合并 PR 的同学可以在这里领取电子证书:👉这次我们准备了,从入门级到进阶级都有。无论你是第一次接触开源,还是已经有一些经验,都能找到适合自己的那一题。

IvorySQL的博客 140

PostgreSQL笔记4: 市场地位、生态全景与行业应用实践

技术能力实现方式适用场景全文检索tsvectortsquery+ GIN 索引内容搜索、日志分析半结构化数据JSONB类型 + GIN 索引灵活 Schema、配置存储向量检索pgvector扩展 + IVFFlat/HNSW 索引RAG、推荐系统、语义搜索混合查询上述能力的 SQL 组合复杂业务场景的统一数据访问表结构创建(若已存在则跳过)插入三条测试数据(包含 JSONB 和向量字段)全文检索查询(tsvectortsqueryJSONB 包含查询(@>运算符)

Wang的专栏 523
上一篇: PGCon2022 会议回顾 | IvorySQL 项目的技术讲解
下一篇: 直播回顾 | 瀚高IvorySQL的开源生态之路
IvorySQL
博客等级 码龄5年 745粉丝 565原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值