2

Informix SQL の「isql」コマンドを使用して、IBM Informix Dynamic Server バージョン 10.00.FC9 でこのストアド プロシージャを作成する際に問題が発生しました (この投稿に対する Jonathan Leffler の回答を参照) 。

(近くの彼の2つの例のそれぞれについて、文字でエラーが発生しますRETURNING CHAR(8)

元。1:

CREATE PROCEDURE ampm_time(tm SMALLINT) RETURNING CHAR(8);
    DEFINE hh SMALLINT;
    DEFINE mm SMALLINT;
    DEFINE am SMALLINT;
    DEFINE m3 CHAR(3);
    DEFINE a3 CHAR(3);
    LET hh = MOD(tm / 100 + 11, 12) + 1;
    LET mm = MOD(tm, 100) + 100;
    LET am = MOD(tm / 1200, 2);
    LET m3 = mm;
    IF am = 0
    THEN LET a3 = ' am';
    ELSE LET a3 = ' pm';
    END IF;
    RETURN (hh || ':' || m3[2,3] || a3);
END PROCEDURE;

元。2:

CREATE PROCEDURE ampm_time(tm SMALLINT) RETURNING CHAR(8);
    DEFINE i2 SMALLINT;
    DEFINE hh SMALLINT;
    DEFINE mm SMALLINT;
    DEFINE am SMALLINT;
    DEFINE m3 CHAR(3);
    DEFINE a3 CHAR(3);
    LET i2 = tm / 100;
    LET hh = MOD(i2 + 11, 12) + 1;
    LET mm = MOD(tm, 100) + 100;
    LET i2 = tm / 1200;
    LET am = MOD(i2, 2);
    LET m3 = mm;
    IF am = 0
    THEN LET a3 = ' am';
    ELSE LET a3 = ' pm';
    END IF;
    RETURN (hh || ':' || m3[2,3] || a3);
END PROCEDURE;

それらは、リンクされた投稿で私が尋ねた質問を解決するために、Jonathan Leffler (Informix Magician extraordinaire) によって設計されました。目的の戻り値は、軍事時間を保持する INT データ型を午後 2 時 30 分型の形式に変換することです。

4

1 に答える 1

2

この問題は DB-Access と ISQL です。

ISQL には歪んだユーモアのセンスがあり、SQL の構文は Informix OnLine 4.10 (または当時は INFORMIX-OnLine 4.10) の最新のものと一致していると考えています。具体的には、ストアド プロシージャがセミコロンで区切られた複数のステートメントで構成されていることを認識せず、SQL ステートメントが文字列やコメントではなく最初のセミコロンで終わると誤って想定します。

回避策:

  • ストアド プロシージャを作成するには、ISQL の代わりに DB-Access を使用します。
  • IIUG Software Archiveから SQLCMD を取得し、代わりにそれを使用します。
  • ストアド プロシージャを作成するには、SQLCMD ソフトウェアの「mkproc」を使用します。

これらのうち、最も簡単なのは DB-Access (別名 dbaccess - サーバー ソフトウェアが存在する $INFORMIXDIR/bin にあります) を使用することです。

于 2009-10-20T18:00:46.790 に答える