2

新しいストアド プロシージャを作成しようとしています。以下は、sp のコード セグメントです。

CREATE PROCEDURE abs_eq (arg1 INTEGER, arg2 INTEGER)
    RETURNS BOOLEAN
    WITH (NOT VARIANT)
    DEFINE ret BOOLEAN;
    IF (arg1 < 0 THEN)
        LET arg1 = -arg1;
    END IF
    IF(arg1 = arg2) THEN
        LET ret = "t";
    ELSE
        LET ret = "f";
    END IF;
    RETURN ret;
END PROCEDURE;
EXECUTE PROCEDURE abs_eq (3, 5);

ただし、このコード セグメントを配置する場所と、リモート データベースでコンパイルする方法がわかりません。この関数を Java で次のように呼び出します。

public void callfunction() throws SQLException {

        CallableStatement proc = null;

        proc = conn.prepareCall("{ call abs_eq(?,?) }");
        proc.setInt(1, 3);
        proc.setInt(2, 5);
        boolean result = proc.execute();
        System.out.println(result);

    }

何をする必要があるかを段階的に説明する明確な説明が必要です

4

1 に答える 1

0

SQLステートメントを実行できるツールを使用して、データベースに「配置」できます。これは、ISA (Informix Server Administrator)、または ODBC または JDBC ドライバーを操作する SQL エディターによって実行できます。もちろん、このタスクに JDBC を使用できます。

stmt = conn.createStatement()
stmt.execute(FUN_BODY)

私は Informix JDBC ドライバーと Jython で使用しています (したがって、行末にセミコロンはありません)。

手順に一部誤りがあります。関数である必要があり、その名前を理解していれば、絶対値を使用して 2 つの int を比較する必要があります。私はそのように書きます:

FUN_BODY = """CREATE FUNCTION abs_eq (arg1 INTEGER, arg2 INTEGER) RETURNING BOOLEAN;
    IF (arg1 == arg2) THEN
        RETURN 't';
    END IF;
    IF (arg1 == -arg2) THEN
        RETURN 't';
    END IF;
    IF (-arg1 == arg2) THEN
        RETURN 't';
    END IF;
    RETURN 'f';
END FUNCTION;
"""

また、いくつかのテストを追加します。テスト ルーチンとテストを含む Jython コードがあります。

def test_abs_eq(proc, arg1, arg2, expected):
    proc.setInt(1, arg1);
    proc.setInt(2, arg2);
    rs = proc.executeQuery();
    while (rs.next()):
        r = rs.getBoolean(1)
        ok = 'ok'
        if r != expected:
            ok = ' ERROR!!!'
        print('%d, %d: %s %s' % (arg1, arg2, r, ok))


def test_multi(db_url, usr, passwd):
    try:
        db = DriverManager.getConnection(db_url, usr, passwd)
        conn = db.createStatement()
        conn.execute(FUN_BODY)
        proc = db.prepareCall("{ call abs_eq(?,?) }");
        test_abs_eq(proc, 0, 0, True)
        test_abs_eq(proc, 3, 4, False)
        test_abs_eq(proc, 3, 3, True)
        test_abs_eq(proc, 20, 0, False)
        test_abs_eq(proc, -20, -20, True)
        test_abs_eq(proc, 20, -20, True)
        test_abs_eq(proc, -20, 20, True)
        test_abs_eq(proc, 20, 20, True)
        db.close()
    except:
        print("there were errors!")
        s = traceback.format_exc()
        sys.stderr.write("%s\n" % (s))
于 2012-05-21T07:07:43.293 に答える