我需要将bytea数组传递给存储过程(声明的类型if bytea[])。
数据get已传递到我的存储过程,但是,我无法从bytea[]获取单个bytea。array_lower和array_upper函数报告维度为1,但tumb_data[1]始终返回空值。
如果我从存储过程中打印整个bytea[]对象,就会得到以“{1,-40,-1,-32,0,16,74,70,73,70,0,1,1”开头的内容,因此我知道数据正在进入过程。
这是一些示例代码,显示了问题:
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://localhost/test";
Connection c = DriverManager.getConnection(url,"andres","xxx");
List<byte[]> thumbData=new ArrayList<byte[]>();
thumbData.add("Test #1".getBytes());
thumbData.add("Test #1".getBytes());
Object[] thumbs=thumbData.toArray();
Array thumbArray=c.createArrayOf("bytea", thumbs);
PreparedStatement stmt=c.prepareStatement("SELECT test_funct(?)");
stmt.setArray(1,thumbArray);
stmt.execute();
这是存储过程:
CREATE OR REPLACE FUNCTION test_funct(a_bytes bytea[])
RETURNS boolean AS
$BODY$DECLARE
v_bytes bytea;
BEGIN
FOR i IN array_lower(a_bytes,1) .. array_upper(a_bytes,1) LOOP
v_bytes:= a_bytes[i];
IF (v_bytes IS NULL) THEN
RAISE EXCEPTION 'error';
END IF;
END LOOP;
RETURN true;
END$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
最后,下面是运行测试程序时的日志输出:
2013-02-17 21:03:52 EST LOG: execute <unnamed>: SET extra_float_digits = 3
2013-02-17 21:03:52 EST LOG: execute <unnamed>: SELECT oid FROM pg_catalog.pg_type WHERE typname = $1
2013-02-17 21:03:52 EST DETAIL: parameters: $1 = '_bytea'
2013-02-17 21:03:52 EST LOG: execute <unnamed>: SELECT e.typdelim FROM pg_catalog.pg_type t, pg_catalog.pg_type e WHERE t.oid = $1 and t.typelem = e.oid
2013-02-17 21:03:52 EST DETAIL: parameters: $1 = '1001'
2013-02-17 21:03:52 EST LOG: execute <unnamed>: SELECT test_funct($1)
2013-02-17 21:03:52 EST DETAIL: parameters: $1 = '{{"\\x3834","\\x313031","\\x313135","\\x313136","\\x3332","\\x3335","\\x3439"},{"\\x3834","\\x313031","\\x313135","\\x313136","\\x3332","\\x3335","\\x3439"}}'
2013-02-17 21:03:52 EST ERROR: error
2013-02-17 21:03:52 EST STATEMENT: SELECT test_funct($1)
2013-02-17 21:03:52 EST LOG: unexpected EOF on client connection
知道怎么把这个传递给我的存储过程吗?
最佳答案
我怀疑你的数组是二维的,而不是一维(线性)的bytea
,你的数组是二维的bytea
。索引这样一个数组的第一个维度将产生空结果。注意,任何维度的PostgreSQL数组仍然具有基本的数组数据类型,没有bytea[][]
等。使用array_ndims(anyarray)
来获取数组维度。
观察一维:
WITH t1(ba) AS (VALUES(ARRAY[ '\x0a', '\x0c', '\x0e' ] :: bytea[]))
SELECT ba, ba[1], ba[1][1] FROM t1;
ba | ba | ba
---------------------------+------+----
{"\\x0a","\\x0c","\\x0e"} | \x0a |
(1 row)
与二维相比:
WITH t1(ba) AS (VALUES(ARRAY[[ '\x0a', '\x0c', '\x0e' ]] :: bytea[]))
SELECT ba, ba[1], ba[1][1] FROM t1;
ba | ba | ba
-----------------------------+----+------
{{"\\x0a","\\x0c","\\x0e"}} | | \x0a
(1 row)
因为您没有显示完整的值或SQL,所以很难说得更多。
如果您怀疑JDBC驱动程序有问题,那么如果您可以提供一个自包含的可编译测试用例来演示该问题,包括用于设置测试数据库的SQL脚本,那么它会有所帮助。
请显示实际运行的SQL,包括传递的参数。您可以从启用
log_statement
的PostgreSQL日志文件中获取此信息。关于java - 在Java中创建bytea数组以传递给Postgresql存储过程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14914365/