postgresql函数具有不受支持的返回类型

vbopmzt1  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(326)

尝试更新表中的特定列值时出错
错误:from中的函数“my\u function”具有不受支持的返回类型触发器
我试图手动运行更新脚本,但由于数据库正在生产中使用,因此编写after触发器时出错。基本上,我想做的是从另一个表中更新一个表的列值,并将该表命名为“table\u name\u temp”。脚本对我来说看起来很好,但是我不确定它到底有什么问题,因为错误响应似乎非常不透明。

Create or REPLACE FUNCTION my_function() RETURNS TRIGGER AS $$
      BEGIN
    update schema_name.table_name set category = schema_name.table_name_temp.category 
        FROM schema_name.table_name_temp 
        WHERE (some where clauses for first check)
        and schema_name.table_name.name = schema_name.table_name_temp.name
        returning null;
      END;
   $$ LANGUAGE plpgsql;

 DROP TRIGGER IF EXISTS trigger_name on schema_name.table_name;

   CREATE TRIGGER trigger_name AFTER UPDATE ON schema_name.table_name
    FOR EACH ROW EXECUTE PROCEDURE my_function();

select * from my_function();
arknldoa

arknldoa1#

不能直接调用触发器函数,它必须由触发器调用。
通常,触发器函数包含新记录和旧记录。这些变量由触发器设置,并在触发器函数中随时可用。如果直接调用触发器函数,则不会设置这些值。
要使用触发器和查询中的同一段代码,它必须位于单独的函数中:

CREATE or REPLACE FUNCTION my_function_that_do_something() RETURNS VOID AS $$
      BEGIN
          update ...;  --no need to return anything
      END;
   $$ LANGUAGE plpgsql;

CREATE or REPLACE FUNCTION my_trigger_function() RETURNS TRIGGER AS $$
      BEGIN
          PERFORM my_function_that_do_something();
          return null;
      END;
   $$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_name AFTER UPDATE ON schema_name.table_name
    FOR EACH ROW EXECUTE PROCEDURE my_trigger_function();

SELECT my_function_that_do_something();

相关问题