0

我有以下存储过程

CREATE FUNCTION runMortalityModel(a_user_id integer) RETURNS integer AS $$
DECLARE
    t1 RECORD;
    t2 RECORD;
    numberOfDeaths integer;
BEGIN
    SELECT person.id personId, person.age, condprobmin, condprobmax, random() experiment
    INTO t1
    FROM person, mortality_cond_prob 
    WHERE (user_id = a_user_id) and
    (person.age = mortality_cond_prob.age);

    SELECT personId
    INTO t2
    FROM t1
    WHERE (tmp.condprobmin <= experiment) and (experiment <= tmp.condprobmax);

    SELECT COUNT(*)
    INTO numberOfDeaths
    FROM t2;

    RAISE 'numberOfDeaths=%', numberOfDeaths;

    EXECUTE 
        'DELETE '
        || 'FROM person '
        || 'WHERE person.id IN ' 
        || t2;

    RETURN numberOfDeaths;
END
$$ LANGUAGE plpgsql;

当我尝试使用运行此存储过程时

SELECT runMortalityModel(1);

我得到错误Relation »t1« doesn't exist

我该如何解决?

更新 1:将存储过程声明更改为

CREATE OR REPLACE FUNCTION runMortalityModel(a_user_id integer) RETURNS integer AS $$
DECLARE
    t1 RECORD;
    t2 RECORD;
    numberOfDeaths integer;
BEGIN
    EXECUTE 'SELECT person.id personId, person.age, condprobmin, condprobmax, random()  experiment '    
    || 'FROM person, mortality_cond_prob '
    || 'WHERE (user_id = ' || a_user_id || ') and '
    || '(person.age = mortality_cond_prob.age)'
    INTO t1;

    EXECUTE 'SELECT personId '
    || 'FROM ' || t1
    || ' WHERE (tmp.condprobmin <= experiment) and (experiment <= tmp.condprobmax)'
    INTO t2;

    EXECUTE 'SELECT COUNT(*) ' 
    || 'FROM ' || t2
    INTO numberOfDeaths;

    RAISE 'numberOfDeaths=%', numberOfDeaths;

    EXECUTE 
        'DELETE '
        || 'FROM person '
        || 'WHERE person.id IN ' 
        || t2;

    RETURN numberOfDeaths;
END
$$ LANGUAGE plpgsql;
4

2 回答 2

3

我看到原始代码有几个问题:

  1. 您正在尝试使用RECORD变量作为关系,您应该这样做... FROM (SELECT t1.*) s
  2. 我认为没有必要选择 1 条记录,然后对该记录进行查询,然后执行count(*),您将始终拥有01作为结果。

你的第二个版本看起来好多了,去吧。

于 2012-10-26T20:35:31.733 回答
0

这个似乎有效。如果你有更好的想法,请告诉他们。

CREATE FUNCTION runMortalityModel(a_user_id integer) RETURNS integer AS $$
DECLARE
    t1 RECORD;
    curRecord RECORD;
    numberOfDeaths integer;
BEGIN
    numberOfDeaths := 0;
    FOR curRecord IN 
        SELECT person.id personId, condprobmin, condprobmax, random() experiment 
        FROM person, mortality_cond_prob 
        WHERE (user_id = a_user_id) and 
        (person.age = mortality_cond_prob.age)
    LOOP
        IF (curRecord.condprobmin <= curRecord.experiment) AND     (curRecord.experiment <= curRecord.condprobmax) THEN
            EXECUTE 
                'DELETE '
                || 'FROM person '
                || 'WHERE person.id = ' || curRecord.personId;
            numberOfDeaths := numberOfDeaths + 1;

        END IF;
    END LOOP;

    RETURN numberOfDeaths;
END
$$ LANGUAGE plpgsql;
于 2012-10-26T20:32:49.483 回答