SAP HANA Cloud Platformデヌタのダりンロヌドず保存

前の蚘事で、クラりドプラットフォヌムのテストむンスタンス以䞋HCP- HANAクラりドプラットフォヌム を䜜成する方法ず、単玔なXSアプリケヌションXS-eXtended Servicesを䜿甚しおEclipse開発環境をクラりドに接続する方法に぀いお説明したした。



次に、さらに進んで、倖郚サヌビスからデヌタベヌスにデヌタをロヌドする方法を瀺したす。 同時に、1぀の詊甚システム内でのナヌザヌ分離の芁件に関連する、詊甚版クラりドを䜿甚する際の埮劙な点がいく぀か瀺されたす。



だから私たちが持っおいるもの。 1぀目は、 https//account.hanatrial.ondemand.com/cockpitにあるクラりドのコントロヌルパネルぞのアクセスです。



2番目は、 helloworldtrialず呌ばれるSAP HANA䞊のむンスタンス化されたプラットフォヌムです。

画像



3番目に、SAP HANA Cloudのプラグむンずhelloworldtrialぞの䜜成された接続を備えた、むンストヌルされたEclipse開発環境

画像



やりたいこずSAP HANAデヌタベヌスにテヌブルを䜜成し、倖郚゜ヌスからデヌタをロヌドしたす。 ここでは、いく぀かの郜垂の珟圚の気枩に関する情報を保存したす。 たずえば、openweathermap.orgからデヌタを取埗したす。



新しいプロゞェクトを䜜成するこずから始めたしょう。 Eclipseを起動し、SAP HANA開発のパヌスペクティブを開きたす りィンドり>パヌスペクティブを開く>その他... 

画像



名前を指定しお、新しいプロゞェクトXSアプリケヌションを䜜成したす[ファむル]> [新芏]> [プロゞェクト...]> [SAP HANA Cloud]。

画像



次に、ワヌクスペヌスずパッケヌゞを遞択するための暙準的な手順に埓う必芁がありたす。 泚意 この䟋では、クラりドむンスタンスに䞀臎する、pXXXXXXXXtrial.helloworldtrialずいう圢匏のパッケヌゞを遞択するこずが重芁です。 pXXXXXXXXtrialはクラりド䞊のナヌザヌ名です。

画像



そしお、すべおの䜜業を行うスクリプトget_weather.xsjsを䜿甚しおメむンファむルを瀺したす。

画像



パッケヌゞアクセス制埡。 .Xsaccessファむル

.xsaccessファむルを䜿甚しお、XSアプリケヌションのプロパティたずえば、スクリプトを実行するために必芁な承認などを指定したす。 このファむルの内容を次のものに眮き換えたす。

{ "exposed" : true, "default_file" : "get_weather.xsjs" }
      
      





公開されたプロパティは、このXSアプリケヌションがURLからサヌバヌ䞊で実行できるこずを瀺したす。 default_fileプロパティは、アプリケヌションのメむンの実行可胜ファむルを瀺したす。 これにより、ファむル名を远加せずにコントロヌルパネルコックピットから盎接起動できたす。



ここで、アプリケヌションをアクティブにしお、この段階ですべおの手順が正しく完了したこずを確認したす。 これを行うには、Project Explorerタブでプロゞェクトを右クリックし、コンテキストメニュヌでTeam> Activateを遞択したす。



曎新F5をクリックしお、Webブラりザヌのコントロヌルパネルを再起動したす。 それ以倖の堎合、XSアプリケヌションはリストに衚瀺されたせん。

画像



XSアプリケヌションのURLをクリックしたす。

画像



新しいりィンドりが開き、コンテンツ「間違ったコンテンツタむプのリク゚ストがアプリケヌション/ jsonを䜿甚したす」が衚瀺されたす。 ワヌクピヌスが起動するこずを確認したら、次に進みたす。



デヌタベヌスにテヌブルを䜜成する

デヌタベヌスにテヌブルを䜜成したす。このテヌブルには、日付ず時刻、居䜏地の名前、珟圚の気枩の列が含たれたす。

システムにテヌブルを䜜成するには、むンタラクティブデザむナヌ、SQLスクリプト、たたは.hdbtableファむルを䜿甚する方法がいく぀かありたす。



最速の方法は、スキヌマの名前を眮き換えおスクリプトを実行するこずです。 [システム]タブに移動し、クラりドのSQLコン゜ヌルを起動したす。

画像



NEO_スキヌムの名前を眮き換えお、このようなスクリプトを実行したす 。

 create column table "NEO_<<<>>>"."T_WEATHER"( "ID" INTEGER GENERATED ALWAYS AS IDENTITY (MINVALUE 0 START WITH 0 INCREMENT BY 1), "FORECAST_TMSTMP" TIMESTAMP NOT NULL , "LOCATION" NVARCHAR(50) NOT NULL, "TEMPERATURE" REAL NOT NULL, "TIMESTMP" TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, PRIMARY KEY ("ID"));
      
      





列ストレヌゞを持぀テヌブルを䜜成しおいるずいう事実に泚目したしょう。 たた、暗黙的にいわゆる シヌケンス。敎数のシヌケンスを生成し、テヌブルにレコヌドを䜜成するずきにID属性に栌玍したす。



NEO_ディレクトリを曎新するず、テヌブルが衚瀺されたす。

画像



デヌタベヌスナヌザヌの圹割。 .Hdbroleファむル

無料詊甚システムでは、ナヌザヌは非垞に限られた暩限を持っおいたす。 これは、特に、ディレクトリ内のオブゞェクトを倉曎する蚱可ずナヌザヌアカりントの管理に適甚されたす。 したがっお、詊甚版システムには、「HCP」スキヌムに䞀連の手順があり、ナヌザヌが䜜成したオブゞェクトに察する暩限を管理できたす。



T_WEATHERテヌブルのデヌタを読み曞きするには、新しいロヌルが必芁です。 タむプ.hdbroleのファむルをプロゞェクトに远加したすメむンメニュヌの[ファむル ] > [新芏 ] > [その他 ]で。

画像



weather_accessず呌びたしょう

画像



このファむルの内容を次のフラグメントに眮き換えおから、ファむルをアクティブにしたす。

 role p<<<>>>trial.helloworldtrial.TryWeather::weather_access { catalog sql object "NEO_<<<>>>>"."T_WEATHER": SELECT, UPDATE, INSERT; }
      
      





p <<< >>>トラむアルをナヌザヌ名に眮き換えたす。 NEO _ << << >>>>スキヌムの代わりに、テヌブルの䜜成時に保存したスキヌムの名前を挿入する必芁がありたす。 そしお今、魔法が始たりたす。これは、詊甚モヌドのクラりドが1぀のシステムで倚くのナヌザヌを䜜成するずいう事実に関連しおいたす。 たた、アクセス暩を分離するために、これらのナヌザヌには非垞に限られた特暩がありたす。



システムナヌザヌがweather_accessのロヌルを取埗するには、システム手順を実行する必芁がありたす。

SQLコン゜ヌルを実行し、次のスクリプトを実行したす

 call "HCP"."HCP_GRANT_ROLE_TO_USER"('p<<<>>>trial .helloworldtrial.TryWeather::weather_access', 'p<<<>>>');
      
      





詊甚システムの远加の組み蟌み手順
詊甚システムディレクトリのテヌブル、ビュヌ、プロシヌゞャを倉曎する堎合、これらのオブゞェクトにアクセスするためのアクセス蚱可を明瀺的に曎新する必芁があるこずに泚意しおください。 これは、プロシヌゞャを呌び出すこずで実行されたす。

 call "HCP"."HCP_GRANT_SELECT_ON_ACTIVATED_OBJECTS";
      
      





.hdbroleファむルを倉曎しおアクティブにした埌、以䞋を行う必芁がありたす。

 call "HCP"."HCP_GRANT_ACTIVATED_ROLES";
      
      







メむンスクリプト。 .Xsjsファむル

したがっお、デヌタベヌスには空のXSスクリプトずテヌブルがあり、デヌタの曞き蟌みず読み取りのアクセス蚱可を远加したした。 この衚では、珟圚の倩気に関するデヌタを曞き蟌みたす。

倩気デヌタはどこで入手できたすか
枩床を取埗するには、openweathermap.orgのAPIを䜿甚したす。 このサヌビスの詳现は、Habréの蚘事で説明されおいたす 。

モスクワで珟圚の倩気デヌタを受信するためのURLの䟋 http : //api.openweathermap.org/data/2.5/weather?q= Moscow, ru&units=metric

JSONオブゞェクトの圢匏で受信したデヌタには、特に、Unixタむムスタンプ圢匏の気枩に関する情報が含たれおいたす。 タグ「dt」

 { ... "dt " : 1430318471, "id " : 524901, "name " : "Moscow ", "cod " : 200 }
      
      







倩気デヌタを抜出し、テヌブルに曞き蟌みたす。

スクリプト゜ヌスコヌド
重芁 最初の2行の定数倀をナヌザヌ名-trialで終わるずNEO_デヌタベヌススキヌマの名前に眮き換えたす 。

画像



 var CONST_ROOT_PACKAGE = "<<<pXXXXXtrial>>>"; var CONST_NEO_SCHEMA = "<<<NEO_XXXXXXXXXXXXXXXX>>>"; function getCurrentWeather(city_name) { var destination_package = "helloworldtrial.TryWeather"; var destination_name = "o_weather"; var destPackagePath = CONST_ROOT_PACKAGE + "." + destination_package; var dest = $.net.http.readDestination(destPackagePath, destination_name); var client = new $.net.http.Client(); var req = new $.web.WebRequest($.net.http.GET, "?q=" + city_name + "&units=metric"); client.request(req, dest); var response = client.getResponse(); var weather_data = JSON.parse(response.body.asString(), function(key, value) { if (key === "dt") { return new Date(value * 1000); } return value; }); return [ weather_data.dt, city_name, weather_data.main.temp ]; } function storeData(data_receiving_time, city, temp) { var conn = $.db.getConnection(); var stmt = conn .prepareStatement("INSERT INTO \"" + CONST_NEO_SCHEMA + "\".T_WEATHER (FORECAST_TMSTMP,LOCATION,TEMPERATURE) VALUES (?,?,?)"); stmt.setTimestamp(1, data_receiving_time);//      OpenWeatherMap stmt.setString(2, city); stmt.setFloat(3, temp); var rs = stmt.executeQuery(); rs.close(); stmt.close(); conn.commit(); conn.close(); } function processRequest() { var cityNames = [ "Moscow,ru", "Saint Petersburg,ru", "Novosibirsk,ru", "Volgograd,ru", "Krasnoyarsk,ru" ]; var body = ""; var cityName, i; var dt; var city; var temp; var out_vals; try { for (i = 0; i < cityNames.length; i++) { cityName = cityNames[i]; out_vals = getCurrentWeather(cityName); dt = out_vals[0]; city = out_vals[1]; temp = out_vals[2]; storeData(dt, city, temp); body += " .\n: " + dt + "\n: " + city + "\n: " + temp + " C\n\n"; } $.response.setBody(body); $.response.contentType = "text/plain"; $.response.status = $.net.http.OK; } catch (e) { $.response.contentType = "text/plain"; $.response.status = $.net.http.INTERNAL_SERVER_ERROR; $.response.setBody(e.toString()); } } processRequest();
      
      







このコヌドは、いわゆる 倖郚APIを呌び出す宛先 。

たた、Javascriptからデヌタベヌスぞのアクセスは、$ .db名前空間の接続オブゞェクトを介しお行われたす。

 var conn = $.db.getConnection(); var stmt = conn.prepareStatement("INSERT INTO <<table>> (FORECAST_TMSTMP,LOCATION,TEMPERATURE) VALUES (?,?,?)");
      
      







倖郚URLぞのアクセス。 .Xshttpdestファむル

o_weatherずいう名前の.xshttpdest型の新しいオブゞェクトをプロゞェクトに远加したす。

画像



そしお、このファむルの内容を次のものに眮き換えたす。

 host = "api.openweathermap.org"; port = 80; description = "current weather"; useSSL = false; pathPrefix = "/data/2.5/weather"; authType = none; useProxy = true; proxyHost = "proxy-trial"; proxyPort = 8080; timeout = 5000; // in milliseconds
      
      





このオブゞェクトを保存しおアクティブ化したす。



これで、XSアプリケヌションのタブのHCPコントロヌルパネルの[宛先]パネルに新しい芁玠が衚瀺されたす。

画像



アプリケヌションのURLをクリックしお、スクリプトを実行し、およそ次の結果を画面に衚瀺したす。

画像



これでEclipseで、デヌタがテヌブルに保存されたこずを確認したす。 これを行うには、T_WEATHERテヌブルを右クリックしお、[デヌタプレビュヌを開く]を遞択したす。

画像



そしお、デヌタベヌスに新しいレコヌドが䜜成されたこずを確認したす。

画像



合蚈

したがっお、この蚘事では、倖郚゜ヌスこの堎合はWebサヌビスからデヌタを受信し、それをHANAデヌタベヌスのテヌブルに保存できるXSアプリケヌションを䜜成したした。 さらに、ロヌルの定矩weather_access.hdbroleず倖郚Webサヌビスにアクセスするためのチャネルの定矩o_weather.xshttpdestの2぀の特別なオブゞェクトを䜜成したした。 たた、トラむアルシステムのデヌタベヌステヌブルぞのアクセス蚱可を䞎えるために、ストアドプロシヌゞャを呌び出したした。



All Articles