当前位置: 首页 > 知识库问答 >
问题:

postgresql触发前调用时出现问题

江佐
2023-03-14

我有一个jdbc客户机与postgresql数据库通信。从JDBC中创建一条准备好的语句,用于在表中插入一些数据,但在创建查询时,客户机不知道要在语句中插入的所有字段,为了完成查询,我编写了一个触发器,在该表上插入之前触发,找到缺少的值,继续执行查询。这是jdbc代码:

String MY_INSERT = "INSERT INTO myTable VALUES(?, ?, ?, ?, ?, ?)";
PreparedStatement pstm = connection.PrepareStatement(MY_INSERT);
pstm5.setInt(1, 2562);
pstm5.setInt(2, 22);
pstm5.setInt(3, 0); //unknown value, set to zero
pstm5.setString(4, "a string");
pstm5.setInt(5, 0); //the other unknown value

这是触发代码:

CREATE FUNCTION perform_() RETURNS trigger AS $myTrigger$

DECLARE 
vend VARCHAR(20);
pre numeric(10,2);

BEGIN
    SELECT field3, field5 FROM otherTable WHERE id = NEW.field2 INTO vend, pre;

    NEW.field3 = vend;
    NEW.field5 = pre;

    RETURN NULL;
END;
$myTrigger$ LANGUAGE plpgsql;

CREATE TRIGGER myTrigger
BEFORE INSERT ON myTable
EXECUTE PROCEDURE perform_(); 

当触发器触发时,我有一个错误:

Exception: JDBCClass error: ERROR: record "new" is not assigned yet
Details: The tuple structure of a not-yet-assigned record is indeterminate.
SELECT field3, field5 FROM otherTable WHERE id = NEW.field2 INTO vend, pre;

这是什么意思?记录新的,正如你在jdbc代码中看到的那样。。。

共有1个答案

万嘉熙
2023-03-14

首先,您错过了触发器声明中的FOR EACH ROW

CREATE TRIGGER myTrigger
BEFORE INSERT ON myTable
FOR EACH ROW EXECUTE PROCEDURE perform_(); 

第二,你必须返回新的 如果希望将记录插入表中

参见sql fiddle演示

 类似资料:
  • 当第一次发生OutOfMemoryException时,我试图使用DebugDiag进行转储时遇到了一个问题。因此,我编写了一个应用程序,可以用来创建内存不足的情况,并遵循以下说明: http://blogs.msdn.com/b/kaushal/archive/2012/05/09/using-debugdiag-to-capture-a-dump-on-first-chance-excepti

  • PostgreSQL 触发器是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。 下面是关于 PostgreSQL 触发器几个比较重要的点: PostgreSQL 触发器可以在下面几种情况下触发: 在执行操作之前(在检查约束并尝试插入、更新或删除之前)。 在执行操作之后(在检查约束并插入、更新或删除完成之后)。 更新操作(在对一个视图进行插入、更新、删除时)。 触发器的 FOR EAC

  • 问题内容: 我想创建一个可以在表“合同”中修改或插入日期的触发器: “如果具有当前合同的客户签订了新合同,则前一个合同的结束日期将是新合同开始日期的前一天” 因此,我的 触发条件 是: 我试图插入这样的行: 该触发器可以很好地编译,但是他们在桌上没有做任何事情。 问题答案: 您想要这样的东西: 但是,它正在更新触发器正在监视的表,并且该触发器似乎将导致更新,该更新将再次调用该触发器并得到一个突变表

  • 我正在使用ProcessBuilder从Java调用Python(Anaconda)代码。当我只安装Python时,它工作正常。但是现在我已经删除了Python并安装了Anaconda。调用Python的代码现在不起作用。得到以下错误。 我正在使用python 3.6.1(anaconda3 4.4.0 64位)和以下代码来执行python 有人能帮我吗。

  • 问题内容: 我想显示一个灯箱,其内容由ng-show显示,但是我不知道如何触发灯箱JS。我正在寻找类似的东西 问题答案: 我认为,最好监视绑定ng- show的模型。 这是示例: 和小提琴

  • 问题内容: 在PostgreSQL中,我有一个名为的表。 如您所见,列为。 在Go中,我想通过请求在该表中创建新条目。我像这样发送JSON对象: 不幸的是,它引发了奇怪的 错误 : 我在哪里犯错误以及如何解决我的问题? models / surveys.go: 控制器/surveys.go: 问题答案: 该错误已说明出了什么问题: 将时间“” 2019-01-01 00:00:00“”解析为“”