当我执行函数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
只有两个字段:amtpaid
和paydetails
(它本身是复合的(。因此,您需要访问payrecord
中paymenttable
记录的所有字段作为payrecord.paydetails.<field_name>
。
结论:
- 将
payrecord
声明为类型record
- 将
ad_seq
作为(payrecord.paydetails).ad_seq
进行访问
有用的调试说明:
为了找到此类错误的原因,手动执行"坏"函数调用并查看结果可能会很有用:
SELECT * FROM adf_function(<place your given parameters here>);
在结果中,您应该能够看到哪些字段具有哪些类型以及它们是否嵌套。
编辑
可能有必要在复合类型变量周围使用副题。有关更多信息,请参阅文档:https://www.postgresql.org/docs/current/rowtypes.html#ROWTYPES-访问