返回首页

gbase数据、南大通用产品文档:GBase8s动态 SQL

更新日期:2024年09月11日

虽然静态 SQL 是有用的,
但在您编写程序的时候,
它要求您知道每个 SQL 语句确切内容。
例如,您必须确切说明在任何 WHERE 子句中测试哪些列,以及在任何选择列表中重命名
哪些列。
当您编写程序来执行定义良好的任务时,不存在任何问题。但不可事先完善地定义某些程
序的数据库任务。特别地,必须响应交互用户的程序可能需要根据用户输入的内容来组合
SQL 语句。
动态 SQL 允许程序在执行期间形成 SQL 语句,
因此,
用户输入决定该语句的内容。
以下
列步骤执行此活动:
1.
程序将 SQL 语句的文本组装为一个字符串,将该字符串存储在程序变量中。
2.
它执行 PREPARE 语句,请求数据库服务器测试该语句文本并为执行来准备它。

3.
它使用 EXECUTE 语句来执行该准备好的语句。
这样,基于任何种类的用户输入,程序可构造并然后使用任何 SQL 语句。例如,它可读
取一个 SQL 语句的文件并准备和执行每一语句。
DB-Access 是一个您可用来交互地探索 SQL 的实用程序,它是一个动态地构造、准备和
执行 SQL 语句的 GBase 8s ESQL/C 程序。例如,DB-Access 允许您使用简单的、交互式
的菜单来指定表的行。当您完成时,DB-Access 动态地构建必需的 CREATE TABLE 或
ALTER TABLE 语句并准备和执行它。

orato8a 导出报错error while loading shared
libraries 等
问题现象
在使用orato8a 导出数据过程中报错./orato8a: error while loading shared libraries:
libclntsh.so.11.1: cannot open shared object file: No such file or directory,
报错./orato8a: error while loading shared libraries: libHbaseThrift.so.0: cannot open

GBase 8a MPP Cluster 最佳实践
5 FAQ
文档版本(2022-02-11)
南大通用数据技术股份有限公司
137
shared object file: No such file or directory 等。
解决方法
使用orato8a-8.6.2.11-R3-redhat6.2-x86_64 在oracle server 服务器上进行测试。

报错找不到libclntsh.so.11.1
# ./orato8a --user='ora01/111111@orcl' --query="select c1,c2 FROM t" --
file='/opt/orato8a_output/t.txt' --field=";" --format=3
./orato8a: error while loading shared libraries: libclntsh.so.11.1: cannot open
shared object file: No such file or directory
在LD_LIBRARY_PATH 中添加libclntsh.so.11.1 所在路径。
# export LD_LIBRARY_PATH=/home/oracle/app/oracle/product/11.2.0/dbhome
_1/lib

报错找不到libHbaseThrift.so.0
# ./orato8a --user='ora01/111111@orcl' --query="select c1,c2 FROM t" --
file='/opt/orato8a_output/t.txt' --field=";" --format=3
./orato8a: error while loading shared libraries: libHbaseThrift.so.0: cannot ope
n shared object file: No such file or directory
libHbaseThrift.so.0 是orato8a 安装包中自带的lib 库,在LD_LIBRARY_PATH 中
添加libHbaseThrift.so.0 所在路径。
export LD_LIBRARY_PATH=/home/oracle/app/oracle/product/11.2.0/dbhome_1
/lib:/opt/setup/orato8a-8.6.2.11-R3

报错FAILED: OCIEnvCreate()
# ./orato8a --user='ora01/111111@orcl' --query="select c1,c2 FROM t" --
file='/opt/orato8a_output/t.txt' --field=";" --format=3
FAILED: OCIEnvCreate()
FAILED: init_handles()[-1]
添加ORACLE_HOME 解决。
export ORACLE_BASE=/home/oracle/app
export ORACLE_HOME=$ORACLE_BASE/oracle/product/11.2.0/dbhome_1
导出成功。
# ./orato8a --user='ora01/111111@orcl' --query="select c1,c2 FROM t" --
file='/opt/orato8a_output/t.txt' --field=";" --format=3
export columns: 2
export rows: 2
export time: 0 sec
process ok!

GBase 8a MPP Cluster 最佳实践
5 FAQ
文档版本(2022-02-11)
南大通用数据技术股份有限公司
138

可以在 SQL 语句的 WHERE 子句中使用 IN 关键字来确定集合是否包含某元素。例如:
下列查询显示如何构造返回 mgr_name 和 department 的值的查询,其
中 Adams 是 direct_reports 列中集合的一个元素。
图: 查询
SELECT mgr_name, department
FROM manager
WHERE 'Adams' IN direct_reports
图: 查询结果
mgr_name Sayles
department marketing

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 80 -
尽管可以使用带有 IN 关键字的 WHERE 子句来搜索简单集合中的特定集合。
但是查询总
是返回整个集合。例如:下列查询返回集合的所有元素,其中 Adams 是 direct_reports 列中
集合的一个元素。
图: 查询
SELECT mgr_name, direct_reports
FROM manager
WHERE 'Adams' IN direct_reports
图: 查询结果
mgr_name Sayles
direct_reports SET {Smith, Waters, Adams, Davis, Kurasawa}
如上所示,对集合列的查询返回整个集合,不是集合中的特定元素。
可以在 WHERE 子句中使用 IN 关键字来只引用简单集合。
不能使用 IN 关键字来引用包
含本身就是集合的字段的集合。例如:不能使用 IN 关键字来引用 manager 表中
的 projects 列,原因是 projects 是嵌套集合。
可以在 SELECT 语句的 WHERE 子句中组合 NOT 和 IN 关键字来搜索不包含某元素
的集合。例如:下列查询显示返回 mgr_name 和 department的值的查询,其中 Adams 不
是 direct_reports 列中集合的元素。
图: 查询
SELECT mgr_name, department
FROM manager
WHERE 'Adams' NOT IN direct_reports
图: 查询结果
mgr_name Williams
department engineering

mgr_name Lyman
department publications

mgr_name Cole
department accounting
有关如何对集合列中的元素进行技术的信息,请参阅基数函数。