错误列引用不明确

时间:2014-11-11 10:56:06

标签: sql function postgresql stored-procedures

我有一个功能:

  1. 比较不同表格中的两列

  2. 制作插页

  3. 如何对此代码进行一些改进,因为我收到此错误:

    ERROR:  column reference "fld_id" is ambiguous
    SQL state: 42702
    line 17 at PERFORM
    
    CREATE OR REPLACE FUNCTION "SA_PRJ".usp_add_timesheet_test(p_uid integer, p_project_id integer, p_allocated_time numeric, p_achieved_time numeric, p_task_desc character varying, p_obs character varying, p_date timestamp without time zone)
      RETURNS void AS
    $BODY$
    
    BEGIN
    DECLARE sum_alloc_time numeric; 
    DECLARE alloc_hours integer;
    DECLARE fld_id integer;
    
        SELECT @sum_alloc_time = SUM(fld_allocated_time)
        from "SD_PRJ".tbl_project_timesheet 
        where fld_project_id = p_project_id;
    
        SELECT @alloc_hours = p.fld_allocated_days, @fld_id = p.fld_id
        FROM "SD_PRJ".tbl_project p
        INNER JOIN "SD_PRJ".tbl_project_timesheet t
        ON p.fld_id=t.fld_id
        where t.fld_project_id = p_project_id;
    
        IF @sum_alloc_time <= @alloc_hours THEN
    
          INSERT INTO "SD_PRJ".tbl_project_timesheet(fld_emp_id, fld_project_id, fld_is_allocated,fld_allocated_time, fld_achieved_time, fld_task_desc, fld_obs, fld_date)
              VALUES (p_uid,p_project_id,coalesce(alloc_id,0), p_allocated_time, p_achieved_time,p_task_desc, p_obs, p_date);
              RAISE NOTICE 'INSERT OK!';
    
         ELSE
           RAISE NOTICE 'NOT OK';
         END IF;
    END;
    
    $BODY$ LANGUAGE plpgsql;
    

    有两个表:

    "SD_PRJ".tbl_project (
      fld_id
     ,fld_allocated_days)
    
    "SD_PRJ".tbl_project_timesheet (
      fld_id
    , fld_project_id
    ,fld_allocated_time)
    

1 个答案:

答案 0 :(得分:1)

工作版:

CREATE OR REPLACE FUNCTION "SA_PRJ".usp_add_timesheet_test(
     p_uid integer, p_project_id integer, p_allocated_time numeric
   , p_achieved_time numeric, p_task_desc varchar, p_obs varchar, p_date timestamp)
  RETURNS void AS
$func$
DECLARE
   _sum_alloc_time numeric; 
   _alloc_hours integer;
   _fld_id integer;
BEGIN
   SELECT SUM(fld_allocated_time)
   INTO          _sum_alloc_time 
   FROM   "SD_PRJ".tbl_project_timesheet 
   WHERE  fld_project_id = p_project_id;

   SELECT p.fld_allocated_days, p.fld_id
   INTO           _alloc_hours,  _fld_id 
   FROM   "SD_PRJ".tbl_project p
   JOIN   "SD_PRJ".tbl_project_timesheet t USING (fld_id)
   WHERE  t.fld_project_id = p_project_id;

   IF _sum_alloc_time <= _alloc_hours THEN

      INSERT INTO "SD_PRJ".tbl_project_timesheet
        (fld_emp_id, fld_project_id, fld_is_allocated,   fld_allocated_time
       , fld_achieved_time, fld_task_desc, fld_obs, fld_date)
      VALUES (p_uid,   p_project_id, coalesce(alloc_id,0), p_allocated_time
         , p_achieved_time,   p_task_desc,   p_obs,   p_date);
      -- alloc_id is undefined, you probably need to use SELECT .. FROM .. instead

      RAISE NOTICE 'INSERT OK!';

   ELSE
      RAISE NOTICE 'NOT OK';
   END IF;
END
$func$ LANGUAGE plpgsql;

但这仍然是不必要的低效率。可以在具有数据修改CTE的单个DML语句中完成。 Try a search for related questions.

您需要先学习基础知识。