我需要将一个 bytea 数组传递给一个存储过程(如果是 bytea[] 则声明的类型)。
数据被传递给我的存储过程,但是,我无法从 bytea[] 中获取单个 bytea。array_lower 和 array_upper 函数报告一维,但 tumb_data[1] 总是返回 NULL。
如果我从存储的过程中打印整个 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
知道如何将其传递给我的存储过程吗?