我们平常都是用SAP HANA Studio来连接数据库、创建新表、导入数据、执行查询等工作,众所周知,SAP HANA是运行在SUSE上的,而SUSE本身是Linux的一个发行版,因此大家肯定会想是否可以通过命令行或者SHELL脚本管理和操纵数据库。答案当然是YESSAP HANA提供了HDBSQL用于数据库的管理、查询和其他一些工作。下面我们就来看看具体的使用。

        SAP HANA的命令行工具主要是hdbsql,可以交互式或非交互式运行,还可以从文件导入命令执行。我们首先来看看如何交互式运行命令。我们现在已经有了一个SAP HANA数据库。进入到命令行后我们需要切换到HANA安装时创建的用户,我们将切换到这个用户名:su – a17adm。然后输入hdbsql,我们就进入了交互式界面,如下图所示。如果你用过MySQL的命令行,应该会觉得似曾相识,确实它们大同小异。本文的测试案例所使用的SAP HANA版本为SAP HANA SPS6 Revision 60.00

/wp-content/uploads/2014/02/1_385508.png

        为了交互式执行命令,必须首先登录到数据库。有两种方式,一种是进入hdbsql后登录。假设我们需要登录的数据库在本机,实例是01。为简单起见,我们就用系统管理员用户名SYSTEM,密码manager,则使用\c选项登录,如下图所示。

/wp-content/uploads/2014/02/2_385509.png

或者还可以在执行hdbsql时直接登录到数据库:hdbsql –n localhost  -i 01 –u SYSTEM –p manager

/wp-content/uploads/2014/02/3_385510.png

除了-n,-i等参数,还有其他一些参数你很可能也会用得着。可以运行hdbsql –help查看所有选项列表。

/wp-content/uploads/2014/02/4_392394.png

好,现在我们可以尝试执行一些命令了。首先我们使用\s看一下数据库的状态:

/wp-content/uploads/2014/02/5_385512.png

这里列出了主机名、数据库名、输入编码等一些基本信息。

        如果你忘记了可以使用的基本命令,可以输入\?或者\h寻求帮助

/wp-content/uploads/2014/02/6_385513.png

       我们举几个常用的命令演示它的用法,其它的可以参考SAP HANA administration guide文档。\dc命令不加参数列出数据库中所有的表信息,包括表名称、字段名、字段类型、字段长度、字段是否可空、主键等,还可以加参数列出某个schema下的表信息,可使用正则表达式,%匹配零个或多个字符,而_匹配一个字符。比如我们想看SYSD开头的所有表:\dc SYS.D%

/wp-content/uploads/2014/02/7_385514.png

MySQL类似,我们可以直接执行SQL命令,只是不需要以分号结束:

SELECT ID, PRICE FROM CLOTHES_MATCHING.CLOTHES_IMAGE

/wp-content/uploads/2014/02/8_385515.png

查询结果的显示是不是和MySQL有点像?我们看到显示结果虽然美观,但是不方便后期处理,相比之下我们更愿意在文件中处理这些数据,更方便的是显示成csv文件的格式,这个时候我们使用\al OFF就可以达到目的。这时的结果如下,更方便使用gawk进行进一步的处理了。

/wp-content/uploads/2014/02/9_385516.png

为了将结果写入文件,\o就派上用场了,它可以将查询结果重定向到指定的文件中,注意,如果文件已经存在,它会将数据附加到文件尾部而不会将其覆盖。

综合实例

       下面我们用一个综合性的例子,结合hdbsqlSHELL脚本来完成一些简单的任务。我们的目标是完成数据库表的建立、导入一些数据、执行一些查询以表明我们的数据已成功导入并可以用来做一些实际的工作了。

        假设我们要建立一个描述客户相关信息的表,其中包括客户编号、客户名、邮编、地址、联系方式这些信息。

CREATE SCHEMA HDBSQL_TEST;

CREATE TABLE HDBSQL_TEST.CUSTOMER

(

                ID INTEGER NOT NULL PRIMARY KEY,

                NAME NVARCHAR(50),

                ZIP NVARCHAR(20),

                ADDRESS NVARCHAR(100),

                TELEPHONE NVARCHAR(20)

);

然后我们准备一些数据,比如data.csv

1001,”Hugh Jackman”,”10086″,”北京市朝阳区新源西里中街“,”65890001”

1011,”Tom Cruise”,”10080″,”朝阳区广顺北大街河荫中路2“,”65890002”

1342,”Dwayne Johnson”,”10081″,”北京市朝阳区霄云路“,”65890011”

1344,”Jennifer Aniston”,”10082″,”北京市东城区东直门内大街“,”56781234”

1111,”Jennifer Lopez”,”20013″,”北京市海淀区花园东路“,”76230912”

1012,”Megan Fox”,”103421″,”纽约市华尔街2“,”56719801”

1317,”Taylor Swift”,”13482″,”芝加哥市“,”54328989”

1042,”Bill Clinton”,”23193″,”华盛顿特区宾夕法尼亚大道1600“,”202-456-1111”

1043,”George W. Bush”,”23193″,”华盛顿特区宾夕法尼亚大道1600“,”202-456-1112”

1044,”Barack Obama”,”23193″,”华盛顿特区宾夕法尼亚大道1600“,”202-456-1113”

我们使用import导入数据,其中假设数据文件在/home/Alex,文件格式是标准的csv

IMPORT FROM CSV FILE ‘/home/Alex/data.csv’ INTO “HDBSQL_TEST”.“CUSTOMER” WITH RECORD DELIMITED BY ‘\n’ FIELD DELIMITED BY ‘,’;

假设我们想要知道在华盛顿的客户信息,则

SELECT NAME, ADDRESS FROM “HDBSQL_TEST”.“CUSTOMER” WHERE ADDRESS LIKE ‘%华盛顿%’;

我们把查询信息保存到文件里,例如out.txt,这样就便于使用gawk等工具进行下一步的处理了。

我们建立一个SHELL脚本test.sh来执行所有这些工作:建立数据库表,导入数据,执行查询,得到结果。我们在hdbsql命令行中用-B-resultencoding指明输入和输出都是UTF8格式以避免可能产生的乱码问题。

#!/bin/bash

host=localhost

instance=1

username=SYSTEM

password=manager

cmdFile=cmd.txt

outputFile=out.txt

encoding=UTF8

HDBSQL=`which hdbsql`

$HDBSQL -n $host -i $instance -u $username -p $password -B $encoding -resultencoding $encoding -I $cmdFile -o $outputFile

if [ $? -eq 0 ]

then

          count=`gawk ‘BEGIN{count = 0;} {if(NR > 1) count++;} END{print count}’ $ outputFile`

         echo “执行成功,总共有 $count 位客户符合条件

fi

其中要执行的命令放到cmd.txt文件中

CREATE SCHEMA HDBSQL_TEST;

CREATE TABLE HDBSQL_TEST.CUSTOMER

(

        ID INTEGER NOT NULL PRIMARY KEY,

        NAME NVARCHAR(50),

        ZIP NVARCHAR(20),

        ADDRESS NVARCHAR(100),

        TELEPHONE NVARCHAR(20)

);

IMPORT FROM CSV FILE ‘/home/Alex/data.csv’ INTO “HDBSQL_TEST”.”CUSTOMER” WITH RECORD DELIMITED BY ‘\n’ FIELD DELIMITED BY ‘,’;

\al OFF;

SELECT NAME, ADDRESS FROM “HDBSQL_TEST”.”CUSTOMER” WHERE ADDRESS LIKE ‘%华盛顿%’;

运行./test.sh 1>output.txt 2>error.txt

现在打开out.txt文件,

/wp-content/uploads/2014/02/10_385517.png

我们得到了想要的结果。如果出现错误,错误信息会写入error.txt文件,帮助定位问题。

        现在我们将hdbsql集成到SHELL脚本中,你可以把它放到cron任务列表来定期执行,或者用gawk对生成的结果进一步处理生成统计报告,发送每日邮件等,一切都很方便。


想获取更多SAP HANA学习资料或有任何疑问,请关注新浪微博@HANAGeek!我们欢迎你的加入!

To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply