gpt4 book ai didi

java - 使用 ResultSet.updateRow 函数更新可更新 View 的行

转载 作者:行者123 更新时间:2023-11-29 12:20:14 25 4
gpt4 key购买 nike

我在 PostgreSQL 服务器上有可更新的 View 。

当我从 pgAnmin3 控制台执行它时,更新查询工作正常,但是当我尝试使用 ResultSet.updateRow() 方法更新此 View 时,我收到以下错误:

org.postgresql.util.PSQLException: No primary key found for table

我想我不能为 View 指定主键。

我可以在客户端应用程序中为 ResultSet.updateRow() 方法指定键列吗?或者我可以为 ResultSet.updateRow() 方法指定一个 WHERE 子句吗?

这是我的表格

CREATE TABLE fin.t_year
(
id serial NOT NULL,
date_begin date NOT NULL,
date_end date NOT NULL,
year_name character varying(128),
CONSTRAINT "PK_year" PRIMARY KEY (id)
)

WITH (
OIDS=FALSE
);


CREATE TABLE fin.t_period
(
id serial NOT NULL,
id_year integer NOT NULL,
per_begin date NOT NULL,
per_end date NOT NULL,
per_name character varying(256),
CONSTRAINT "PK_period" PRIMARY KEY (id),
CONSTRAINT "FK_period_year" FOREIGN KEY (id_year)
REFERENCES fin.t_year (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)

WITH (
OIDS=FALSE
);


CREATE VIEW fin.vi_period AS
SELECT per.id,
per.per_begin AS "Begin",
per.per_end AS "End",
per.per_name AS "Name",
y.year_name AS "Year"
FROM fin.t_period per
JOIN fin.t_year y ON y.id = per.id_year;



CREATE OR REPLACE FUNCTION fin.tgfn_vi_period_update()
RETURNS trigger AS
$BODY$
DECLARE
id_row INTEGER;
id_curr INTEGER;
result RECORD;
BEGIN
id_curr = NEW.id;

-- Replace text identifier with integer primary key
IF NEW."Year" IS NOT NULL THEN

SELECT id INTO id_row
FROM fin.t_year
WHERE year_name = NEW."Year";
UPDATE fin.t_period SET id_year = id_row
WHERE id = id_curr;

END IF;


IF NEW."Begin" IS NOT NULL THEN

UPDATE fin.t_period SET per_begin = NEW."Begin"
WHERE id = id_curr;
END IF;
IF NEW."End" IS NOT NULL THEN

UPDATE fin.t_period SET per_end = NEW."End"
WHERE id = id_curr;
END IF;
IF NEW."Name" IS NOT NULL THEN
UPDATE fin.t_period SET per_name = NEW."Name"
WHERE id = id_curr;
END IF;



SELECT * INTO result FROM fin.vi_period WHERE id = id_curr;
RETURN result;

END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

这个插入语句工作正常

UPDATE fin.vi_period SET "Year" = 'new_year_name' WHERE id  = 10;

但是这段java代码的问题

statement = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = statement.ExecuteQuery("SELECT * FROM fin.vi_period;");


rs.absolute(pos + 1);
rs.updateString("new_year_name");
rs.updateRow();

最佳答案

问题是您正在查询一个 View ,而该 View 没有主键(我不确定使用 PostgreSQL 是否可行,但大多数数据库不支持)。 JDBC 驱动程序需要一个主键才能使结果集可更新。

换句话说:你不能通过结果集来更新这个 View 。您要么需要使用显式 UPDATE 语句,要么直接在基础表上执行此操作,而不是通过 View 。

关于java - 使用 ResultSet.updateRow 函数更新可更新 View 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29898754/

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