1

以下の informix sp を C# から呼び出したいのですが、コンパイルに問題があります。「2012-11-22」のような文字列と「08:15:00」のような 2 回の文字列を渡し、日付と 2 つの日時に変換したいのですが、正しい informix 関数が見つからないようです。私はこれを理解しようと一日中過ごしました。

いくつかの機密部分を削除する必要があったため、以下のコードがコンパイルされるかどうかはわかりませんが、アイデアを提供するのに十分であることを願っています.

TO_DATE関数は間違っていると思います

create procedure up_myproc(
calndr_dt CHAR(15)
, actvty_typ CHAR(5)
, actvty_start_tm CHAR(15)
, actvty_end_tm CHAR(15)
, actvty_cap SMALLINT
)

DEFINE calendar_activity_id int;
DEFINE activity_details_id int;

-- calendar activity
insert into caa61140 (
caa61140001
, caa61140004
, caa61140005
)
values (
0
, org_id
, DATE(calndr_dt)
);

LET calendar_activity_id = DBINFO('sqlca.sqlerrd1');

-- activity details
insert into caa61240 (
caa61240001
, caa61240002
, caa61240003
, caa61240004
)
values (
0
,calendar_activity_id
, TO_DATE(actvty_start_tm, "%H:%M" )
, TO_DATE (actvty_end_tm, "%H:%M" )
);

LET activity_details_id = DBINFO('sqlca.sqlerrd1');

-- calendar matter
insert into caa61340(caa61340001
, caa61340002)
SELECT activity_details_id
, caa60840003 matter_typ
  FROM caa60840 -- valid matter types;
  WHERE caa60840001=org_id
  AND caa60840002=actvty_typ;

end procedure;
4

1 に答える 1

1

これにアプローチする方法は、Informix の暗黙的な変換機能を使用することです。

CREATE PROCEDURE up_myproc(
    calndr_dt       DATETIME YEAR TO DAY,
    actvty_typ      CHAR(5),
    actvty_start_tm INTERVAL HOUR TO SECOND,
    actvty_end_tm   INTERVAL HOUR TO SECOND,  
    actvty_cap      SMALLINT)

    DEFINE tm_1 DATETIME YEAR TO SECOND;
    DEFINE tm_2 DATETIME YEAR TO SECOND;

    LET tm_1 = EXTEND(clndr_dt, YEAR TO SECOND) + actvty_start_tm;
    LET tm_2 = EXTEND(clndr_dt, YEAR TO SECOND) + actvty_end_tm;

    ...

ここでの重要な決定は、時間を DATETIME HOUR TO MINUTE としてではなく、INTERVAL HOUR TO MINUTE として扱うことでした。正式な DATETIME HOUR TO MINUTE パラメータがある場合は、算術演算ができるように INTERVAL に変換する必要があります。DATETIME と INTERVAL を追加できます。結果は DATETIME です。2 つの DATETIME 値を減算できます。結果はINTERVALです。2 つの INTERVAL 値を加算または減算すると、結果が INTERVAL になります。しかし、それはそれについてです。したがって、DATETIME HOUR TO SECOND から INTERVAL を取得するには、DATETIME(00:00:00) HOUR TO SECOND を減算します。

この改訂された関数は、現在行っているのと同じように、文字列引数を指定して呼び出すことができます。

そのようにインターフェイスを変更することに腹を立てることができない場合は、次のようにします。

CREATE PROCEDURE up_myproc(
    calndr_dt_str       DATETIME YEAR TO DAY,
    actvty_typ          CHAR(5),
    actvty_start_tm_str CHAR(15),
    actvty_end_tm_str   CHAR(15),  
    actvty_cap          SMALLINT)

    DEFINE calndr_dt       DATETIME YEAR TO DAY;
    DEFINE actvty_start_tm INTERVAL HOUR TO SECOND;
    DEFINE actvty_end_tm   INTERVAL HOUR TO SECOND;  

    DEFINE tm_1 DATETIME YEAR TO SECOND;
    DEFINE tm_2 DATETIME YEAR TO SECOND;

    LET actvty_dt       = actvty_dt_str
    LET actvty_start_tm = actvty_start_tm_str;
    LET actvty_end_tm   = actvty_end_tm_str;
    LET tm_1            = EXTEND(clndr_dt, YEAR TO SECOND) + actvty_start_tm;
    LET tm_2            = EXTEND(clndr_dt, YEAR TO SECOND) + actvty_end_tm;

    ...

これは依然として変換に依存していますが、それらをプロシージャ本体に隠して明示的にしています。

コードはテストされていません。私が見落としているものがあるかもしれません。

于 2012-08-28T16:11:08.857 に答える