SQL on Anywhere

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

    使用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语句,对于处理结果集的方式,建议按下表处理:

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

    • “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()…’)。
      • 不能发送交互命令,如:切换用户需要输入密码的场景等。