Plpgsql 函数将 BigInt 转换为 XID 和 java
Posted
技术标签:
【中文标题】Plpgsql 函数将 BigInt 转换为 XID 和 java【英文标题】:Plpgsql function convert BigInt to XID and java 【发布时间】:2013-12-11 22:21:38 【问题描述】:对不起,如果这个问题已经回答了,但我自己找不到。
我在 plgsql 中有一个这样的函数:
CREATE OR REPLACE FUNCTION collect_transaction_data(xid) RETURNS TEXT AS
$$
DECLARE
...
BEGIN
IF EXISTS (SELECT 1 FROM my_transactions WHERE my_tx_id = $1) THEN
-- Do something useful...
...
END IF;
END;
$$ LANGUAGE plpgsql;
如果我编写一个小函数,使用当前事务 ID 从 postgres 中调用此函数,一切正常:
PERFORM collect_transaction_data(current_tx_id);
但是,如果我尝试从 Java 调用相同的函数,它会抱怨具有整数值的函数不存在(就是这种情况)。我有一个类似于以下的代码:
public boolean testCollectTransactionData(BigInteger my_tx_id)
String sql = String.format("SELECT amqp.collect_transaction_data(%s) AS my_result",
my_tx_id.toString());
java.sql.Statement tx_st = m_oTxDbConnector.getDbConnection().createStatement();
java.sql.ResultSet tx_rs = tx_st.executeQuery(sql);
tx_rs.next();
String my_result = tx_rs.getString("my_result");
...
如果我使用 SQL 语句使用相同的方法,它就可以正常工作(来自 Java):
String sql = String.format("SELECT * FROM my_test_table WHERE my_tx_id = %s",
my_tx_id.toString());
java.sql.Statement tx_st = m_oTxDbConnector.getDbConnection().createStatement();
java.sql.ResultSet tx_rs = tx_st.executeQuery(sql);
...
我做错了什么?有办法解决吗?
非常感谢任何帮助,
D.
PS。 对于这个问题,我找不到更好的标题。请根据您的需要进行更正。
【问题讨论】:
试试collect_transaction_data(%s::xid)
感谢您的回答。不幸的是,它不起作用:org.postgresql.util.PSQLException: ERROR: cannot cast type integer to xid。有没有办法直接在 plpgsql 中做到这一点?尝试 CAST 没有成功,但可能是我没有正确使用它?
我找到了以下内容,但我不确定这是否是正确的做法。在上面的 plpgsql 函数中,将其转换为以下内容: CREATE OR REPLACE FUNCTION collect_transaction_data(bigint) RETURNS TEXT AS $$ DECLARE my_tx_id_from_int xid; ... 开始 my_tx_id_from_int := $1; IF EXISTS (SELECT 1 FROM my_transactions WHERE my_tx_id = my_tx_id_from_int) THEN -- 做一些有用的事... ... END IF;结尾; $$ 语言 plpgsql;
【参考方案1】:
在其他人提出更好的方法之前,以下方法确实对我有用:
CREATE OR REPLACE FUNCTION collect_transaction_data(bigint) RETURNS TEXT AS $$
DECLARE
my_tx_id_from_int xid;
...
BEGIN
my_tx_id_from_int := $1;
IF EXISTS (SELECT 1 FROM my_transactions WHERE my_tx_id = my_tx_id_from_int) THEN
-- Do something useful...
...
END IF;
END;
$$ LANGUAGE plpgsql;
【讨论】:
以上是关于Plpgsql 函数将 BigInt 转换为 XID 和 java的主要内容,如果未能解决你的问题,请参考以下文章
Greenplum plpgsql 函数在输入结束时返回语法错误