如何在 PostgreSQL 的表上运行函数插入或更新冲突



我想使用冲突时执行更新功能从另一个表插入和更新一个表。

我尝试执行该函数,但没有一个有效。

创建或替换函数ecisdrdm.pr_mig_stg_application_cdim (v_Ret OUT bigint ( 作为 $$ 声明 v_ErrorCode比金特; v_ErrorMsg瓦尔查尔(512(; v_Module 瓦尔查尔(32( = 'pr_mig_stg_application_cdim';

开始


-- 合并:STG_APPLICATION_CDIM成APPLICATION_CDIM

插入application_cdim作为产品 (prod.application_id,
prod.receipt_number,prod.init_frm_id,prod.frm_typ_id,prod.sbmtd_dt_id,prod.crtd_user_id,prod.init_src_sys_id, prod.init_svc_ctr_id,prod.mig_filename(选择stg.application_id, stg.receipt_number、stg.init_frm_id、stg.frm_typ_id、stg.sbmtd_dt_id、 stg.crtd_user_id、stg.init_src_sys_id、stg.init_svc_ctr_id, stg.mig_filename 来自ecisdrdm.stg_application STG 关于冲突 (application_id( 做更新集 ( prod.init_frm_id, prod.frm_typ_id,产品。sbmtd_dt_id、prod.crtd_user_id、 prod.init_src_sys_id、prod.init_svc_ctr_id、prod.mig_filename、 prod.mig_modified_dt ( =(选择stg.init_frm_id、stg.frm_typ_id、stg.sbmtd_dt_id、stg.crtd_user_id、stg.init_src_sys_id、stg.init_svc_ctr_id、 stg.mig_filename,current_timestamp来自ecisdrdm.stg_application_cdim stg 其中 prod.receipt_number = stg.receipt_number (;
返回;

---- -- 将返回代码设置为 0 ----

v_Ret := SQLCODE;


-- 异常错误处理程序 ----例外,当其他人v_ErrorCode := SQLCODE; v_ErrorMsg := SQLERRM; v_Ret := v_ErrorCode;

---- -- 将记录提交到错误日志中----执行 pr_write_error_log( CURRENT_USER, inet_server_addr((, v_Module, v_ErrorCode,v_ErrorMsg(;

---- -- 故意将"提交"留给应用程序----结束; $$ 语言 plpgsql;

错误:必须指定函数结果类型 SQL 状态:42P13 选择 ecisdrdm.pr_mig_stg_application_cdim(2000(;错误:函数 ecisdrdm.pr_mig_stg_application_cdim(整数( 不存在 第 1 行: 选择ecisdrdm.pr_mig_stg_application_cdim(2000(; ^

提示:没有函数与给定的名称和参数类型匹配。你 可能需要添加显式类型转换。SQL 状态:42883 字符:8

错误:函数 pr_mig_stg_application_cdim(( 不存在 第 1 行:选择pr_mig_stg_application_cdim ((; ^

提示:没有函数与给定的名称和参数类型匹配。你 可能需要添加显式类型转换。SQL 状态:42883 字符:8

关于我做错了什么有什么建议吗? 以及如何像甲骨文一样运行函数? 数据库版本 11.1 在 AWS 中运行,使用 pgAdmin v.4.4

工作脚本

CREATE OR REPLACE FUNCTION cidrstaging.pr_mig_stg_application_cdim(
OUT v_ret text)
RETURNS text
LANGUAGE 'plpgsql'
COST 100
VOLATILE 
AS $BODY$
DECLARE 
v_module                text = 'pr_mig_stg_application_cdim';
host                    text = inet_server_addr();
errorcode               text;
errormsg                text;
errormsg_detail         text;
errormsg_hint           text;

BEGIN
---
-- Simply delete the data from production table
----

DELETE FROM cidrdata.ref_application_cdim WHERE 1=1;
---
--  refresh ref_action_code from stg_ref_action_code
---
INSERT INTO cidrdata.ref_application_cdim
SELECT stg.code, stg.action, stg.mig_filename
FROM cidrstaging.stg_ref_application_cdim stg;
----
--   Set return to "Success" for pr_mig_stg_application_cdim function
----
v_ret := 'Success';  
EXCEPTION
WHEN OTHERS THEN
GET STACKED DIAGNOSTICS 
errormsg = MESSAGE_TEXT,
errormsg_detail = PG_EXCEPTION_DETAIL,
errormsg_hint = PG_EXCEPTION_HINT;  
errorcode := SQLSTATE;
v_ret := concat('ERROR - FUNC: ' || v_module || ' ERRORCODE: ', errorcode, ' MSG: ' || errormsg || ' ', errormsg_detail || ' ', errormsg_hint);
-- NOTE: Only writes to errorlog table if function is called directly
-- If called through the pr_mig_stg_application_cdim function the exception is raised and caught there instead
PERFORM cidrstaging.pr_write_error_log( CURRENT_USER, host, v_module, errorcode, v_ret );
END;
$BODY$;

最新更新