2016-07-19 17 views
0

私はsap hanaの世界では新しいです。私はストアドプロシージャを使用して情報を更新しようとしています。私はフィールド名、フィールド値と行IDを持つカスタムテーブルタイプを送信したい。 私はこのタイプの作成:ストアドプロシージャのカスタムテーブルタイプsap hana

CREATE TYPE t_field AS TABLE (
    ID INTEGER, 
    FLD VARCHAR(100), 
    VAL VARCHAR(100)); 

をそして、私は、この手順でそれを使用:

PROCEDURE "_SYS_BIC"."Match.procedures::updateAnag" (
    in tfield tt_field, 
    out error tt_error 
) 

LANGUAGE SQLSCRIPT 
SQL SECURITY INVOKER 
DEFAULT SCHEMA "_SYS_BIC" 
AS 

BEGIN 

    declare _id integer; 
    declare _field varchar(100); 
    declare _value varchar(100); 

    select ID, F_NAME, F_VALUE 
    into _id, _field, _value 
    from :tfield; 

    IF(_field = '' OR _value = '') THEN 
     error = SELECT 400 AS http_status_code, 
       'empty field' as error_message, 
        'All fields must be filled' as detail from dummy; 
    ELSE 

    IF (_field = 'name') THEN 
     UPDATE "_SYS_BIC"."TEST_TABLE" 
     SET NAME = _value 
     WHERE ID = _id; 
    END IF; 

    IF (_field = 'surname') THEN 
     UPDATE "_SYS_BIC"."TEST_TABLE" 
     SET SURNAME = _value 
     WHERE ID = _id; 
    END IF; 

    END IF; 

END; 

しかし、私は、コードをアクティブ化しようとすると、Eclipseは私にこのエラーが返されます。 「SAP-UI-コア.js:159 2016-07-19 17:45:47.751550次の問題が発生しました:HTTPリクエストfailed400、Bad Request、リクエストにエンティティɷ anagTypeɲに存在しないプロパティが含まれています。 - '

誰かが私にそれを修正したり、これを行うためのよりよい方法を教えてもらえますか?

+1

[OK]をクリックして、更新手順で「柔軟性」を持たせたいと思いますが、これはやっかいな方法です。情報データブロックを明示的にし、列の1:1マッピングで直接更新を実行します。空のフィールドは、手動でチェックするか、テーブル上でNOT NULL制約にしておくことができます。 –

+0

ご協力ありがとうございます。このポストでは、私が最も関心を持つのは、カスタムテーブルでこのプロシージャが動作しない理由を理解することです。このアプローチは孤立したケースです。 – Shiroga

答えて

1

よし、眺めのSQLSCriptコードポイントから、私はここに一つの問題を言うと思いますが、あなたは(_valueまたは_idなど)の変数を使用するときにそれらの前にコロンを持っている必要があるということです。

CREATE PROCEDURE "_SYS_BIC"."Match.procedures::updateAnag" (
    in tfield tt_field, 
    out error tt_error 
) 

LANGUAGE SQLSCRIPT 
SQL SECURITY INVOKER 
DEFAULT SCHEMA "_SYS_BIC" 
AS 

BEGIN 

    declare _id integer; 
    declare _field varchar(100); 
    declare _value varchar(100); 

    select ID, F_NAME, F_VALUE 
    into _id, _field, _value 
    from :tfield; 

    IF(:_field = '' OR _:value = '') THEN 
     error = SELECT 400 AS http_status_code, 
       'empty field' as error_message, 
        'All fields must be filled' as detail from dummy; 
    ELSE 

    IF (:_field = 'name') THEN 
     UPDATE "_SYS_BIC"."TEST_TABLE" 
     SET NAME = :_value 
     WHERE ID = :_id; 
    END IF; 

    IF (:_field = 'surname') THEN 
     UPDATE "_SYS_BIC"."TEST_TABLE" 
     SET SURNAME = :_value 
     WHERE ID = :_id; 
    END IF; 

    END IF; 

END; 

別の問題は、IFステートメントの2番目のブランチでテーブル変数のエラーを初期化しないことです。

これはすべてあなたのエラーメッセージと関係があります。最初にプロシージャを呼び出してテストし、xsjsページへの接続が正しく機能しない理由を確認することができます。

+0

私はxsjsページを使用しません。私はこの手順を.xsodataから呼び出します。私はこの解決策を試してみます。ありがとう! – Shiroga

関連する問題