在informix中创建存储过程

Posted

技术标签:

【中文标题】在informix中创建存储过程【英文标题】:Creating stored procedure in informix 【发布时间】:2012-05-17 14:02:12 【问题描述】:

我正在尝试创建新的存储过程。 下面是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);

    

我需要一个清晰的解释,逐步描述我需要做什么

【问题讨论】:

【参考方案1】:

您可以使用任何可以运行 sql 语句的工具将其“放入”数据库中。这可以通过 ISA(Informix Server Administrator)或使用 ODBC 或 JDBC 驱动程序的 SQL 编辑器来完成。当然你可以使用 JDBC 来完成这个任务:

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

我将它与 Informix JDBC 驱动程序和 Jython 一起使用(因此,行尾没有分号)。

您在程序中有一些错误。它应该是函数,如果我理解它的名称,它应该使用它们的绝对值比较两个整数。我会这样写:

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))

【讨论】:

感谢您的帮助。当我尝试通过 JDBC 驱动程序编写我的存储函数时,它会导致错误,表示 sytanx 错误。我在 sql 语句上方找不到任何错误。如果你找到了,你能帮帮我吗?

以上是关于在informix中创建存储过程的主要内容,如果未能解决你的问题,请参考以下文章

Informix 存储过程通用异常处理

如何在存储过程中创建视图

在存储过程中创建临时表

在存储过程中创建动态表而在 PL/SQL 块表中创建时权限不足[重复]

mysql - 在存储过程中创建事件

如何在mysql中创建存储过程