记录类型输出参数函数不起作用



当我执行函数schemaA.ad_update时,payrecord.paydetails.ad_seq出现以下错误。

Error : missing FROM-clause entry for table "paydetails".

我想因为paydetails来自"schemaB"的函数,所以我使用了这个错误作为payrecord.schemaB.ydetails.ad_seq.

Error: cross-database references are not implemented: payrecord.schemaB.paydetails.ad_seq 

请帮帮我。

提前谢谢。

CREATE OR REPLACE FUNCTION schemaA.ad_update(p_custno varchar, custseq numeric)
RETURNS record
LANGUAGE plpgsql
AS $function$
declare
payrecord              RECORD;
ppdate timestamp:=current_timestamp;
ppseq numeric:=1;
deamtpaid numeric;
begin
payrecord:= schemaB.adf_function(  p_custno,
custseq,
deamtpaid, 
ppdate,
ppseq
);  
deamtpaid:=payrecord.amtpaid;                                                                                                                   
update paymenttable
set dps_seq = 15
where ad_seq = payrecord.paydetails.ad_seq  -- As you suggested
end $function$;

create or replace  function schemaB.adf_function(custno     IN VARCHAR,
custseq IN NUMERIC,
amtpaid      inout NUMERIC,
paydate       IN TIMESTAMP(0),
paidseq     IN NUMERIC,
paydetails     out paymenttable) RETURNS RECORD as
$adf_function$
declare
c_seq               numeric := 1;
m_seq                numeric := 1;
v_custno           VARCHAR;
v_clsid    numeric;
v_otamt    NUMERIC := 0;
v_pending   NUMERIC := 0;
v_remark                VARCHAR(255);
v_flag      boolean;
pptrecord RECORD;
begin
select * from accountinfo(custno ) into v_flag;
if not v_flag then
select * from mstr_function(v_custno,
paidseq,
c_seq,
v_remark,
v_pending,
v_otamt,
paydate,
m_seq,
v_clsid) into pptrecord;

v_pending:= pptrecord.p_pending;
paydetails:= pptrecord.p_mstr_record; -- where p_mstr_record is out parameter in  mstr_function as p_mstr_record     out paymenttable
v_otamt:= pptrecord.p_otamt;                               
amtpaid := v_pending;
end $adf_function$ language plpgsql;

让我们来看看函数adf_function:它返回一个包含字段amtpaid(类型为numeric(和paydetails(类型为paymenttable(的记录。

因此,将其结果分配给类型为paymenttable的变量是不可行的(因为缺少一列,而且amtpaid将被分配给该类型的第一个字段,因此以下值被移位,不再与指定的类型匹配,请将其与错误value too long for type character varying(20)进行比较(。

因此有必要将payrecord声明为类型record。出现错误record "payrecord" has no field "ad_seq",因为payrecord只有两个字段:amtpaidpaydetails(它本身是复合的(。因此,您需要访问payrecordpaymenttable记录的所有字段作为payrecord.paydetails.<field_name>

结论:

  1. payrecord声明为类型record
  2. ad_seq作为(payrecord.paydetails).ad_seq进行访问

有用的调试说明:

为了找到此类错误的原因,手动执行"坏"函数调用并查看结果可能会很有用:

SELECT * FROM adf_function(<place your given parameters here>);

在结果中,您应该能够看到哪些字段具有哪些类型以及它们是否嵌套。

编辑

可能有必要在复合类型变量周围使用副题。有关更多信息,请参阅文档:https://www.postgresql.org/docs/current/rowtypes.html#ROWTYPES-访问

最新更新