Java 使用ResultSet.updateRow函数更新可更新视图的行
我在PostgreSQL server上有可更新的视图 当我从pgAnmin3控制台执行更新查询时,它工作正常,但是当我尝试使用Java 使用ResultSet.updateRow函数更新可更新视图的行,java,postgresql,jdbc,resultset,updatable-views,Java,Postgresql,Jdbc,Resultset,Updatable Views,我在PostgreSQL server上有可更新的视图 当我从pgAnmin3控制台执行更新查询时,它工作正常,但是当我尝试使用ResultSet.updateRow()方法更新此视图时,我得到以下错误: org.postgresql.util.PSQLException:未找到表的主键 我想我不能为视图指定主键 我可以为客户端应用程序中的ResultSet.updateRow()方法指定键列吗?或者我可以为ResultSet.updateRow()方法指定WHERE子句吗 这是我的桌子 CRE
ResultSet.updateRow()
方法更新此视图时,我得到以下错误:
org.postgresql.util.PSQLException:未找到表的主键
我想我不能为视图指定主键
我可以为客户端应用程序中的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;
这个insert语句工作得很好
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();
问题是您正在查询一个视图,而该视图没有主键(我不确定PostgreSQL是否可以这样做,但大多数数据库不支持这一点)。JDBC驱动程序需要主键才能使结果集可更新
换句话说:不能通过结果集更新此视图。您需要使用显式的
UPDATE
语句,或者直接在基础表上执行此操作,而不是通过视图执行此操作。能否给出表的结构以及用于更新表的sql语句。