【问题标题】:CREATE TABLE is not allowed in a non-volatile function非易失性函数中不允许 CREATE TABLE
【发布时间】:2019-12-27 14:58:31
【问题描述】:

我有以下三个表:

create table drugs(
    id integer,
    name varchar(20),
    primary key(id)
);
create table prescription(
    id integer,
    drug_id integer,
    primary key(id),
    foreign key(drug_id) references drugs(id)
);
create table visits(
    patient_id varchar(10),
    prescription_id integer,
    primary key( patient_id , prescription_id),
    foreign key(prescription_id) references prescription(id)
);

我在这些表格上写了以下函数来显示患者的药物列表(患者 id 是参数):

CREATE OR REPLACE FUNCTION public.patients_drugs(
    patientid character varying)
    RETURNS TABLE(drug_id integer, drug_name character varying) 
    LANGUAGE 'plpgsql'

    COST 100
    STABLE STRICT 
    ROWS 1000

AS $BODY$
begin
    create temporary table result_table(
        drug_id integer,
        drug_name varchar(20)
    );
    return  query select distinct drug.id , drug.name 
    from  visits join prescription
    on visits.patient_id = patientID;

end;
$BODY$;

但是,它给了我这个错误:

非易失性函数中不允许创建 TABLE

【问题讨论】:

  • 在函数定义中使用VOLATILE STRICT 而不是STABLE STRICT。
  • (另外我建议将STABLE/VOLATILE 和STRICT 放在两个单独的行上)

标签: postgresql function non-volatile


【解决方案1】:

您无需创建表即可“返回表”。只需摆脱 CREATE TABLE 语句。

但是您的查询也不正确,因为您从drug 表中选择列,但您从未将其包含在FROM 子句中。如果您不使用连接,但使用 EXISTS 条件,您也可以去掉 distinct 子句:

CREATE OR REPLACE FUNCTION public.patients_drugs(p_patientid character varying)
    RETURNS TABLE(drug_id integer, drug_name character varying) 
    LANGUAGE plpgsql
AS $BODY$
begin
  return query 
    select d.*
    from drugs d
    where exists (select *
                  from prescription p
                    join visits v on v.prescription_id = p.id
                  where d.id = p.drug_id
                   and v.patientid = p_patientid);
end;
$BODY$;

或者更好,使用简单的 SQL 函数:

CREATE OR REPLACE FUNCTION public.patients_drugs(p_patientid character varying)
    RETURNS TABLE(drug_id integer, drug_name character varying) 
    LANGUAGE sql
AS 
$BODY$
  select d.*
  from drugs d
  where exists (select *
                from prescription p
                  join visits v on v.prescription_id = p.id
                where d.id = p.drug_id
                  and v.patientid = p_patientid);
$BODY$;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多