跳到主要内容

一个帖子 标记为 "PostgreSQL"

查看所有标记

· 1 分钟阅读

2022年渥太华时间5月26日瀚高北美研究院负责人Grant Zhou在会上发表IvorySQL项目的技术讲解。本次会议内容主要介绍了我们是谁、IvorySQL是什么、IvorySQL的关键功能点、社区贡献指南、开发者指南等。重点介绍了基于 PostgreSQL 14,IvorySQL在PostgreSQL基础之上添加了一些令人兴奋的功能点!!

IvorySQL在PostgreSQL的基础上增加的主要功能特点包括

  • Oracle兼容包

  • Oracle兼容PL/iSQL过程语言

  • GUC在Oracle和PostgreSQL模式之间切换

  • Oracle兼容各种DDL操作的语法

  • Oracle兼容的日期/时间函数

  • 内置Orafce (https://github.com/orafce/orafce)

更多功能特性描述,可参阅https://www.ivorysql.org/zh-CN/releases-page的发布说明。

大家可以通过IvorySQL产品路线图(https://github.com/IvorySQL/IvorySQL/issues)定期查看GitHub中的问题选项卡可获得最新的功能列表。

bilibili 视频讲解链接

PGCon2022会议回顾|IvorySQL项目的技术讲解_哔哩哔哩_bilibili

因为时差的原因,有许多小伙伴没有看到,小助理特意为大家整理好了会议视频内容以及中文PPT材料,有需要的小伙伴们,关注公众号,添加小助理微信即可获得。


通过订阅邮件列表加入IvorySQL社区:

还有,别忘了在Github给我们一个 ⭐

· 1 分钟阅读

IvorySQL is an open source project. One of the core goals of this project is to deliver oracle compatibility, So that one can use the oracle code on IvorySQL database server.

Providing Oracle compatibility on top of PostgreSQL is a multi-dimensional task. Ranging from providing the Oracle compatible SQL syntax to adding support for data types that are either missing or behaves differently in PostgreSQL. One of the main core of Oracle compatibility is to provide the compatible PL (procedural language) in PostgreSQL that is functionally and syntactical compatible with Oracle's PL/SQL. For that purpose IvorySQL has added a new PL language PL/iSQL that that accepts, understands and executes the PL/SQL syntax. And as you know one of the core feature of Oracle's PL/SQL is the PACKAGES. Package is a schema object in Oracle that contains definitions for a group of related functionalities and is one of the most widely used feature of Oracle.

So In this blog I will give a introduction of Packages followed by an example on how you can create, use, and destroy Oracle style packages with IvorySQL.

Packages

So what are packages? The Packages are grouping of PL/iSQL code, divided in logical program units. In other words a package can be considered a collection of related functions, procedures, variables or cursors. This collection is collectively be accessed via the common name.

IvorySQL has PL/iSQL language that accepts, understands and executes the PL/SQL code. The packages use this same language. The packages have two main components.

  • Package Specification The package specification lists all the items that can be accessed from outside the package. such as functions, procedures, variables and cursors. This is also know as public specification.

  • Package Body The Package Body contains the implementation of all functions and procedures that are listed in the package specification. In addition these, it can also implement more function and procedure or other elements.

These elements that are not in the package specification, will be treated private members of the package and these can only be referenced from within the package. The outside access is not permitted.

The package body can also have a special code block called initializer block. This is a special because this block is executed only once per session, at the very beginning when the package is first accessed.

Let's see some example of the code and see how a package operates.

Example

Generic Example

First let's set the compatibility mode, so we can access oracle compatible features available in the ivorysql database.

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

Let's create a simple package. This package declares a cursor to list all available books. Have some subprograms to list, add and remove books. It also declares a some private variables to keep count and book information.

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

Let checkout the count. This anonymous block tries to access the private members of the package, which should result in error.

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

Let's list all available books using the subprogram list_books of the package 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=#

Let's add a new book using the subprogram add_book of the package 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;
/

Dropping a Package

One can either drop the package body or complete package using:

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

Package Invocation with different rights

We are going to create two packages with invoker and definer rights and watch the results to see how they differentiate.

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

-- Create a Package with INVOKER rights

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

-- Create a Package with DEFINER rights

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

Let's see the package with invoker rights first.

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

Let's see the package with definer rights.

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

Let's switch to another user named ivuser

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

Let's see the package with invoker rights first.

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

Let's see the package with definer rights.

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

As shown above when the package with invoker rights (pkg_invrights) is called, it's using the privileges of the user that invoked the package. However, when a definer package (pkg_defrights) is called, it still uses the privileges of the package owner.

· 1 分钟阅读

硅谷Postgres会议是西海岸最大的PG会议,也是美国乃至全球Postgres年度重要会议之一,于2022年4月7日至8日(PDT)在美国加利福尼亚州圣何塞希尔顿酒店召开。作为面向全球PostgreSQL技术专家、从业者、爱好者的年度技术交流活动,硅谷会议致力于汇集和讨论关于人、Postgres和数据间的关系!会议与主办地硅谷一样极具包容和公平精神,这里汇集了最优秀的演讲者、听众和赞助商,所有人努力为全球Postgres生态系统创造发展机会。

会议现场人数大概有200多人,是疫情以来聚集人数最多的一次线下会议。

社区核心人员Bruce Momjian出席,会议由PostgresConf,Joshua D.Drake, Jim Mlodgenski 等组织。来自中国、美国、加拿大、巴西、西班牙、德国、印度、巴基斯坦等多个国家的人员参与。

瀚高北美研究院兼中国PostgreSQL分会国际顾问委员会秘书长Grant Zhou作为唯一中国代表,将携IvorySQL项目亮相本次会议。

以下是由IvorySQL开源数据库社区为您带来的硅谷Postgres两日会议简报。

部分演讲议题

IvorySQL--一个基于PostgreSQL的兼容Oracle的开源数据库 --by GRANT ZHOU

有很多用户需要将他们的应用程序从Oracle迁移到开放源码的Postgres,但是为了支持新的数据库,用户经常需要重新开发应用程序,这很不方便。如果有一个基于Postgres的数据库,并且兼容大多数Oracle语法和函数,对客户来说就太方便了。然而官方的Postgres项目不接受这种代码提交。毕竟,Postgres是Postgres, Oracle是Oracle。因此,IvorySQL项目团队创建一个Oracle兼容的数据库。

本演讲中介绍了如何基于PG实现与Oracle语法兼容的数据库,并介绍IvorySQL项目。这个项目是一个开源项目(Apache 2.0),由Highgo软件领导,目前已经发布了基于PostgreSQL 14.2版本的IvorySQL 1.2。

同时欢迎大家为这个开源的侧重Oracle兼容性的数据库——IvorySQL做出贡献。

非关系型Postgres --by Bruce Momjian

Postgres一直对关系存储提供强大的支持。然而,在许多情况下,关系存储要么效率低下,要么限制过度。这个演讲展示了Postgres扩展到支持非关系存储的许多方式,特别是在一个数据库字段中存储和索引多个值(甚至是不相关的值)的能力。这种存储可以提高效率和访问的简单性,还可以避免实体-属性-值(eav)存储的缺点。演讲涵盖多个字段多值存储的例子,包括数组、范围类型、几何图形、全文搜索、xml、json和记录。

数字权力和隐私:21世纪的关注--by Andres Arrieta

30多年来,电子前沿基金会一直在保护和争取我们的公民自由。在这30年里发生了很多事情:我们与互联网的关系从根本上发生了改变,然而,在很多方面,我们对互联网如何运作的理解仍然停滞不前。如今,互联网已经成为我们生活中不可或缺的核心部分,我们越来越依赖互联网。虽然我们比以往任何时候都更容易接触到互联网提供的众多礼物,但决策者和执法机构对互联网如何运作的理解仍然滞后。在此期间,电子前沿基金会及其使命已经涵盖了技术带来的好或坏的许多方面,并帮助保护那些受其影响的人,同时确保一个光明的未来,通过创新改善我们的生活。

Andres Arrieta向大家介绍了我们的一些工作、一些关切的领域以及Andres Arrieta认为将有助于我们朝着更美好的未来努力的一些事情。主要是关于数据隐私和消费者权利的理论视角。讨论了隐私的不同方面以及保护个人隐私的选项。

逻辑复制的过去、现在和未来--by Amit Kapila

在这次演讲中,Amit Kapila讲述了逻辑复制在PostgreSQL中是如何发展的。这将解释最近的一些最近的主要增强,比如促进两阶段和正在进行的大型事务的逻辑复制。并分享了Amit Kapila对如何利用该技术为大型企业构建高度可伸缩和可用的数据库解决方案的看法。在那之后,还讨论了在PostgreSQL未来版本中在这个技术领域中讨论的一些重要增强。并且介绍如何增强这项技术,以便将数据从PostgreSQL迁移到其他数据库。

现代原生云应用的传记--by Karthik Ranganathan

现代云原生应用程序过着令人兴奋的生活 - 从它们在云中诞生,到处理巨大的计划外成功,再到在云中断中幸存下来并处理全球客户。在本次演讲中,Yugabyte 首席技术官 Karthik Ranganathan 从数据层的角度介绍了Yugabyte 如何处理双向表级复制和高可用性。

Aurora的亚马逊Babelfish--by chandra pathivada

现在奥罗拉的Babelfish已经上市了。这个演示是关于Babelfish如何帮助客户迁移SQL Server工作负载到Postgres。在这个演示中,chandra pathivada演示了什么是Babelfish, Aurora的内部结构,使用Babelfish的SQL Server dba的Aurora,以及应用程序迁移实验室。

现场照片

p

p

p

p

p

更多详情内容

2022年硅谷Postgres会议官方网址: https://postgresconf.org/conferences/SV2022

关于IvorySQL

IvorySQL项目是一个具有广泛生态基础和中国特色的PG开源衍生项目,是瀚高公司设计研发的一款具备强大Oracle兼容能力的开源数据库。 具备高兼容性和高可用性,并致力于遵守open-source ways。 IvorySQL社区欢迎并赞赏所有类型的贡献,期待您的加入!


通过订阅邮件列表加入IvorySQL社区:

还有,别忘了在Github给我们一个 ⭐

· 1 分钟阅读

Hi~各位朋友们,我们的PostgresWorld Webinars又回来啦!

PostgreSQL在国内数据库的发展过程中承担了非常重要的角色,全球众多数据库产品选择PostgreSQL作为技术发展路线。但是应用程序从Oracle迁移到开源Postgres的问题成为了最大的阻碍,因此我们创建了IvorySQL开源项目,它是基于最新的PostgreSQL 14并具有强大Oracle兼容性的数据库。 然而我们为什么一定要做IvorySQL开源项目?它和Postgres、Oracle技术上有什么区别?本次网络研讨会邀您一起探讨。

本期网络研讨会由Grant Zhou带来《IvorySQL - 一个基于PostgreSQL的兼容Oracle的开源数据库》为主题的分享,共同探讨基于PG并兼容Oracle的开源数据库。

嘉宾介绍

Grant Zhou目前居住在加拿大,他是瀚高北美研究院的负责人,并领导PostgreSQL公司开发团队,团队成员来自加拿大,中国和巴基斯坦。他同时担任PostgreSQL中国分会国际顾问委员会的秘书长,也很自豪能成为PostgresConf的组织者和亚洲联络人。他在阿尔卡特朗讯(诺基亚)公司工作了十多年,在高可用性、实时电信系统、数据库技术和Unix/Linux编程方面拥有丰富的经验。 2021年12月,该团队宣布了IvorySQL数据库的第一个可用版本,这是目前唯一一款基于PostgreSQL、兼容Oracle的开源数据库。2022年2月28日,基于PostgreSQL 14.2发布了IvorySQL 1.2。

研讨会要点介绍

有许多用户需要将他们的应用程序从Oracle迁移到开源Postgres,但是为了支持新的数据库,用户经常需要重新开发应用程序,这很不方便。如果有一个基于Postgres的数据库,并且与大多数Oracle语法和函数兼容,那么对于客户来说就太方便了。 但是,官方的Postgres项目不会接受这种代码提交。毕竟,Postgres是Postgres,Oracle是Oracle。 因此,我们创建了一个具有Oracle兼容功能的开源数据库项目。 本次演讲将介绍如何基于PG实现与Oracle语法兼容的数据库,详细介绍IvorySQL项目的研发过程

时间与链接


Join the IvorySQL community by subscribing to mailing lists:

Also, don't forget to give us a ⭐ on Github

· 1 分钟阅读

Hello

正当全世界都在为节日打包行李,迎接新年的到来时,我们正努力工作,并为我们的团队从2021年初开始的项目做最后的润色。那天是12月15日,就在那天结束之前,我们得到了所有的绿灯,在清理桌子之前,我们默默地发布了IvorySQL的第一个版本。

IvorySQL概览

IvorySQL是Apache 2.0许可的开源Oracle兼容PostgreSQL。IvorySQL的第一个版本源自PostgreSQL 14,它坚定地承诺始终保持100%的PostgreSQL兼容性,并可以直接替换PostgreSQL的最新版本。

IvorySQL在现有标准PostgreSQL配置参数的基础上添加了一个兼容的_db GUC。 compatible_db 是一个切换开关,用于在Oracle和PostgreSQL兼容模式之间切换。IvorySQL的第二大亮点是 PL/iSQL 支持oracle PL/SQL语法的过程语言。这两个新增功能在不破坏标准PostgreSQL兼容性的情况下,是IvorySQL的Oracle兼容性的核心。compatible_db 切换在Oracle和PostgreSQL中存在的函数和对象的行为,并以不同的方式运行,而PL/iSQL 为在最小的更改上运行IORYSQL的Oracle代码奠定了基础。

IvorySQL具有许多与Oracle兼容的功能,包括Oracle风格的PACKAGES, DATA Types, 和 Conversion Functions. 有关IvorySQL中Oracle兼容性功能的详细信息,请参阅 IvorySQL文档

我们致力于遵循开源方式的原则

IvorySQL致力于遵守 open-source ways 我们坚信建设一个健康、包容的社区。我们坚持认为好的想法可以来自任何地方,最好的想法应该获胜。只有包含不同的观点,我们才能做出最佳决策。虽然IvorySQL的第一个版本主要关注Oracle兼容性功能,但未来的路线图和功能集将由社区以开源的方式确定。

为IvorySQL做贡献

有很多方法可以帮助IvorySQL。您可以通过提供文档更新和文档翻译来做出贡献。如果你有设计技能,你可以为IvorySQL网站项目做出贡献。 测试IvorySQL和报告问题,通过发布bug修复或新功能的pull请求,或回答邮件列表上的问题,是对IvorySQL项目做出贡献的一些方式,IvorySQL社区欢迎并赞赏所有类型的贡献。

快速开始

所有与IvorySQL相关的项目,包括数据库服务器、网站和文档,都通过Github托管和管理。您可以通过IvorySQL Github page下载源代码或发布的软件包.

浏览 http://www.ivorysql.org 阅读项目文档和贡献指南。


通过订阅邮件列表加入IvorySQL社区:

还有,别忘了在Github给我们一个 ⭐