gpt4 book ai didi

postgresql - 如何从 postgres 存储函数中读取 UDT

转载 作者:行者123 更新时间:2023-11-29 12:06:46 24 4
gpt4 key购买 nike

我似乎无法从存储的函数中正确读取 UDTpostgres JDBC 驱动程序。这是一些示例代码:

CREATE TYPE u_country AS ENUM ('Brazil', 'England', 'Germany')

CREATE TYPE u_street_type AS (
street VARCHAR(100),
no VARCHAR(30)
)

CREATE TYPE u_address_type AS (
street u_street_type,
zip VARCHAR(50),
city VARCHAR(50),
country u_country,
since DATE,
code INTEGER
)

CREATE TABLE t_author (
id INTEGER NOT NULL PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50) NOT NULL,
date_of_birth DATE,
year_of_birth INTEGER,
address u_address_type
)

INSERT INTO t_author VALUES (1, 'George', 'Orwell',
TO_DATE('1903-06-25', 'YYYY-MM-DD'), 1903, ROW(ROW('Parliament Hill',
'77'), 'NW31A9', 'Hampstead', 'England', '1980-01-01', null))
INSERT INTO t_author VALUES (2, 'Paulo', 'Coelho',
TO_DATE('1947-08-24', 'YYYY-MM-DD'), 1947, ROW(ROW('Caixa Postal',
'43.003'), null, 'Rio de Janeiro', 'Brazil', '1940-01-01', 2))

CREATE FUNCTION p_enhance_address2 (address OUT u_address_type)
AS $$
BEGIN
SELECT t_author.address
INTO address
FROM t_author
WHERE first_name = 'George';
END;
$$ LANGUAGE plpgsql;

现在上面的内容在 postgres 中完美运行。我也可以选择 UDT列 t_author.address 直接用 SQL SELECT 语句。但当我通过 JDBC 从存储的函数 p_enhance_address2 中选择,我得到一个奇怪的行为。我尝试了这两种调用方案:

connection.prepareStatement("select * from p_enhance_address2()");
connection.prepareCall("{ call p_enhance_address2(?) }");
// the latter with an output parameter registered

两种调用方案都会导致相同的行为(实际上CallableStatement 只不过是从函数中选择)。似乎有两个截然不同的问题:

嵌套的 UDT 结构完全搞砸了获取结果。这是我用 JDBC 得到的:

PreparedStatement stmt = connection.prepareStatement(
"select * from p_enhance_address2()");
ResultSet rs = stmt.executeQuery();

while (rs.next()) {
System.out.println("# of columns: " +
rs.getMetaData().getColumnCount());
System.out.println(rs.getObject(1));
}

输出:

nr of columns: 6 ("(""Parliament Hill"",77)",NW31A9)

为什么有 6 列?以及为什么错误地获取了 UDT(许多字段丢失)

嵌套UDT时可以实现一点改进u_street_type 被“扁平化”为 varchar,这导致假设 JDBC 驱动程序不支持嵌套的 UDT:

CREATE TYPE u_address_type AS (
street VARCHAR(80),
zip VARCHAR(50),
city VARCHAR(50),
country u_country,
since DATE,
code INTEGER
)

INSERT INTO t_author VALUES (1, 'George', 'Orwell',
TO_DATE('1903-06-25', 'YYYY-MM-DD'), 1903, ROW('Parliament Hill 77',
'NW31A9', 'Hampstead', 'England', '1980-01-01', null))
INSERT INTO t_author VALUES (2, 'Paulo', 'Coelho',
TO_DATE('1947-08-24', 'YYYY-MM-DD'), 1947, ROW('Caixa Postal 43.003',
null, 'Rio de Janeiro', 'Brazil', '1940-01-01', 2))

那么结果会是这样的:

nr of columns: 6 ("Parliament Hill 77",NW31A9,Hampstead,England,1980-01-01,)

UDT 记录现在看起来是正确的(从位于位置 1)。但结果集中仍然有 6 列。

一些事实:

  • 我在 pgAdmin III 中没有遇到这些问题
  • 我使用 PostgreSQL 9.0.1,由 Visual C++ build 1500 编译,64 位
  • 我使用 postgresql-9.0-801.jdbc4.jar

有人知道哪里出了问题吗?

最佳答案

我可以重现这个,这似乎是一个错误。

我建议您将此发布到 PostgreSQL JDBC 邮件列表,以便开发人员可以解决此问题。

关于postgresql - 如何从 postgres 存储函数中读取 UDT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4652651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com