【问题标题】:Error column reference is ambiguous错误列引用不明确
【发布时间】:2015-01-07 21:40:04
【问题描述】:

我有一个函数:

  1. 比较不同表中的两列

  2. 进行插入

由于出现此错误,我如何才能对此代码进行一些改进:

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)

【问题讨论】:

  • 您需要向我们展示您的表格结构,以及包含错误的行。
  • SELECT @sum_alloc_time = SUM(fld_allocated_time) 是 Postgres 的无效 SQL。这看起来更像是用于 SQL Server 的 T-SQL。
  • 我正在研究 T-SQL 但现在我需要创建一个 Postgresql 函数并从 T-SQL 中获取一些关键字,因为现在我正在学习 postgresql。
  • 请先阅读 Postgres 手册。除了模棱两可的列问题之外,还有更多错误
  • 你能对我的代码做一些改进吗?因为我只需要完成这个功能。

标签: sql function postgresql stored-procedures


【解决方案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.

你需要先学习基础知识。

【讨论】:

  • 感谢改进!
猜你喜欢
  • 2018-07-02
  • 2018-01-26
  • 1970-01-01
  • 2012-05-31
  • 2013-05-29
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多