Skip to Content

1 OData 介绍

       OData 全称是Open Data Protocol, 即开放数据协议,由微软公司最初提出,它的主要用途便是通过Web来对数据库中的数据进行查询与更新。在SAP HANA XS Engine中提供了OData的实现,所以在开发基于XS Engine的应用程序时,如果使用OData来访问数据,将会十分方便与快捷。另外,OData也可以作为其他应用的数据源,不一定需要ODBC或者JDBC去访问SAP HANA中的数据。

       在当前的SAP HANA XS Engine中只提供OData 2.0 的支持,字符编码限制为UTF-8, 提供的数据以XML或者JSON格式返回,对于修改操作,例如CREATE, UPDATE 只提供JSON格式。

2 OData 基本使用

以下将通过具体的实例来说明OData的使用情况。

2. 1 数据准备

SAP HANA Studio中建立一个PRODUCT(测试用的schema:WEIYY)SQL 语句如下:

CREATE COLUMN TABLE “WEIYY”.“PRODUCT” (“id” INTEGER CS_INT NOT NULL ,

      “category_id” INTEGER CS_INT,

      “name” NVARCHAR(50),

      “color” NVARCHAR(50),

      “length” INTEGER CS_INT,

      “width” INTEGER CS_INT,

      “height” INTEGER CS_INT,

      “price” DECIMAL(10,

     2) CS_FIXED,

      “desc” NVARCHAR(500),

      “desc_cn” NVARCHAR(500),

      PRIMARY KEY (“id”));

向其中插入的数据如下:

data.PNG

             我们将利用OData来暴露这个表中的数据,从而通过Web进行访问。

2.2 建立XS Project

因为OData是基于XS Engine的,所有需要建立一个XS Project。打开SAP HANA  Studio, 选择File->new->Project, 如下图所示:

new.PNG

选择XS Project , Next, 输入Project Name :weiyy.testodata,

testodata.PNG

然后添加两个文件

  • (1) 文件名.xsapp,文件内容为空。
  • (2) 文件名.xsaccess,文件内容如下:

                   {

     “exposed”:true

     }

然后新建一个product.xsodata文件,用来暴露我们准备数据表,其中的内容如下:

   service{

     “WEIYY”.”PRODUCT” as “product”;

}

表示在OData服务中,将暴露“WEIYY”.”PRODUCT”这个数据表。

此时项目结构如下:

struct.PNG

然后share这个project, commit, 最后选择activate. repository中,能看到对应的项目,

rep.PNG

到此,OData最基本的部署就算完成了,打开浏览器,输入如下地址信息:

http://<hana.server.name>:80<HANA_instance_number> /weiyy/testodata/product.xsodata

xmlodata.PNG

2.3    OData URI 规范

在此本文只介绍基本的查询规范,更多URI规范见http://www.odata.org/documentation/odata-version-2-0/uri-conventions 这里需要注意的是,这里的约定不是SAP HANA官方规定的,因此有可能不被SAP HANA支持(仅少数,比如endswith函数),但是SAP HANADevelop Guide里面又没有相关的URI介绍,所以此约定仅供参考。

  • (1) 选择product表中id=1的记录,并以json格式返回(默认以XML格式返回)

http://<IP>:8000/weiyy/testodata/product.xsodata/product?$filter=id%20eq%201%20&$format=json

{“d”:{“results”:[{“__metadata”: {“uri”:”http://10.128.80.235:8000/weiyy/testodata/product.xsodata/product(1)”,”type”:”weiyy.testodata.product.productType”},”id”:1,”category_id”:1,”name”:”ABC Table”,”color”:”Black”,”length”:140,”width”:80,”height”:80,”price”:”2000″,”desc”:”This is the ABC Table. It is black.”,”desc_cn”:”这是ABC桌子。它是黑色的。“}]}}

  • (2) 选择product表中前3条记录

http:// <IP>:8000/weiyy/testodata/product.xsodata/product?$top=3

<结果集稍微有点长,此处忽略>

  • (3) 只选择id这一列

http:// <IP>:8000/weiyy/testodata/product.xsodata/product?$select=id&$format=json

{“d”:{“results”:[{“__metadata”: {“uri”:”http://10.128.80.235:8000/weiyy/testodata/product.xsodata/product(1)”,”type”:”weiyy.testodata.product.productType”},”id”:1},{“__metadata”: {“uri”:”http://10.128.80.235:8000/weiyy/testodata/product.xsodata/product(2)”,”type”:”weiyy.testodata.product.productType”},”id”:2},{“__metadata”: {“uri”:”http://10.128.80.235:8000/weiyy/testodata/product.xsodata/product(3)”,”type”:”weiyy.testodata.product.productType”},”id”:3},{“__metadata”: {“uri”:”http://10.128.80.235:8000/weiyy/testodata/product.xsodata/product(4)”,”type”:”weiyy.testodata.product.productType”},”id”:4},{“__metadata”: {“uri”:”http://10.128.80.235:8000/weiyy/testodata/product.xsodata/product(5)”,”type”:”weiyy.testodata.product.productType”},”id”:5},{“__metadata”: {“uri”:”http://10.128.80.235:8000/weiyy/testodata/product.xsodata/product(6)”,”type”:”weiyy.testodata.product.productType”},”id”:6},{“__metadata”: {“uri”:”http://10.128.80.235:8000/weiyy/testodata/product.xsodata/product(7)”,”type”:”weiyy.testodata.product.productType”},”id”:7},{“__metadata”: {“uri”:”http://10.128.80.235:8000/weiyy/testodata/product.xsodata/product(8)”,”type”:”weiyy.testodata.product.productType”},”id”:8},{“__metadata”: {“uri”:”http://10.128.80.235:8000/weiyy/testodata/product.xsodata/product(9)”,”type”:”weiyy.testodata.product.productType”},”id”:9},{“__metadata”: {“uri”:”http://10.128.80.235:8000/weiyy/testodata/product.xsodata/product(10)”,”type”:”weiyy.testodata.product.productType”},”id”:10}]}}

            URI的约定还有很多,能够实现一些基本的类似SQL的选择与投影操作,但对于多表join这类复杂的还没有办法单独利用URI来完成,这时可以在SAP HANA中建立查询对应的视图,再用OData对这个视图进行暴露。

参考资料:

http://help.sap.com/hana/SAP_HANA_Developer_Guide_en.pdf

http://www.odata.org/documentation/odata-version-2-0/uri-conventions

[本文的测试案例所使用的SAP HANA版本为SAP HANA SPS7 Revision 70.00]

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

转载本文章请注明作者和出处http://scn.sap.com/community/chinese/hana/blog/2014/07/23/%E5%9C%A8sap-hana%E4%B8%AD%E4%BD%BF%E7%94%A8odata%E4%B8%80,请勿用于任何商业用途。

To report this post you need to login first.

1 Comment

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

Leave a Reply