SQL on Anywhere

当前用于大数据处理的引擎组件种类繁多,且各自提供了丰富的接口供用户使用。但对传统数据库用户来说,SQL语言依然是最熟悉和方便的一种接口。如果能在一个客户端中使用SQL语句操作不同的大数据组件,将极大提升使用各种大数据组件的效率。

openGauss支持SQL on Anywhere,基于openGauss可以操作Hadoop、Oracle、Spark和other openGauss,构筑起统一的大数据计算平台。

基于Extension Connector的跨数据库实例访问数据

使用openGauss提供的Extension Connector可以将SQL语句发送到数据库实例外部的Oracle数据库、Spark和其他openGauss数据库实例,并在当前库中返回执行结果,实数据库实例处理数据。

Extension Connector的基本工作原理是:用户首先构建Data Source对象(其中包含目标库的一些连接信息和字符编码方式),然后用户获取该Data Source的使用权限,最后通过标准ODBC API连接目标库,发送SQL语句并获取执行结果。

为了方便使用,Extension Connector为用户提供了统一的连接函数exec_on_extension(text, text)。其中,第一个参数为Data Source名称,第二个参数为发送的SQL语句。

函数exec_on_extension具有如下特点:

  • exec_on_extension连接目标库的权限由控制Data Source的使用权限实现。

  • exec_on_extension处理字符的编码方式放在了Data Source对象中,缺省值为UTF-8。

  • exec_on_extension是返回类型为record的函数,即数据集。因而语法上需要’AS(表定义)’来接收返回的数据,且不能省略,其基本调用形式如下,且不支持CALL调用:

  • exec_on_extension支持发送多种类型的SQL语句,对于处理结果集的方式,建议按下表处理:

    SQL语句类型

    SQL语句返回结果

    AS子句

    DDL

    (如CREATE、DROP等)

    空集:表示成功

    非空:表示失败

    可定义为一列text类型:

    (c1 text)

    DQL

    (如SELECT、FROM等)

    数据表

    类型需要与返回值类型按列匹配

    DML

    (如INSERT、UPDATE等)

    空集:表示成功

    非空:表示失败

    可定义为一列text类型:

    (c1 text)

    显示文本命令

    (如SHOW、EXPLAIN等)

    若干行、列数据

    可定义成对应返回列数的text类型,如返回两列文本,则可定义为:(c1 text, c2 text)

使用函数exec_on_extension需要注意以下约束:

  • exec_on_extension优先去Data Source对象中寻找USERNAME和PASSWORD,若未找到,则由unixODBC去配置文件odbc.ini中寻找,若仍未找到,则连接失败。如果Data Source对象中给出了错误的而odbc.ini中给出了正确的USERNAME和PASSWORD,则也是连接失败。
  • “SELECT * FROM exec_on_extension() AS (C1, C2, …, Cn )” 中AS子句标定的列是取“执行SQL语句返回的数据”的前n列(靠前原则),因此要注意列类型与返回数据前n列匹配(如果列类型不匹配则可能得到错误的结果或执行失败),不能只取返回的中间或后面部分列,且AS子句中的列数也不能多于总共返回的列数。
  • exec_on_extension不检查发送的SQL语句的合法性,仅支持发送一条SQL语句,建议不要发送以下SQL语句或内容(函数exec_hadoop_sql也遵循该约束),如:
    • 不能发送只在当前session中有效的命令或SQL语句,如:建临时表。
    • 不能发起事务,如:start transaction等。
    • 不能在发送的SQL语句中再次调用exec_on_extension或exec_hadoop_sql函数,如:select * from exec_on_extension(‘xxx’, ‘select * from exec_on_extension()…’)。
    • 不能发送客户端命令,如:openGauss数据库实例的《工具参考》中“客户端工具 > gsql > 元命令参考”章节,Oracle的SQLPlus命令等。
    • 不能发送交互命令,如:切换用户需要输入密码的场景等。

SQL on Anywhere - 图1 说明:

  1. 为保证兼容性,保留了上个版本对接Spark数据库实例的连接函数exec_hadoop_sql。也就是说既可以使用exec_on_extension也可以使用exec_hadoop_sql进行Spark对接。由于exec_hadoop_sql存在安全问题,只有赋权后才能使用,建议用户使用exec_on_extension函数。
  2. 在MySQL兼容性下暂不支持exec_on_extension和exec_hadoop_sql函数的使用。