sql语句被忽略并且找不到关键字

Posted

技术标签:

【中文标题】sql语句被忽略并且找不到关键字【英文标题】:sql statement ignored and from key word not found 【发布时间】:2011-05-04 01:04:28 【问题描述】:

这会导致ORA-00923: From keyword not found 错误:

create or replace function gr_pay_hrly (p_wage_rate IN Number, 
                                        p_hrs_worked In number)
Return Number IS

  t_wage pay_history.wage_rate%type;
  t_hours pay_history.hrs_worked%type;
  t_gross_pay number(10,2);

BEGIN

  select wage_rate into t_wage, 
         hrs_worked into t_hours
    from pay_history
   where wage_rate = p_wage_rate
     and hrs_worked = p_hrs_worked;

  IF t_hours >= 40 THEN
    t_gross_pay := (((t_hours - 40) * t_wage) * 1.5);
  ELSE
    t_gross_pay := t_hours * t_wage;
  END IF;

  RETURN t_gross_pay;

  END;
  /

【问题讨论】:

这个逻辑看起来很古怪。您正在选择和操作与传入的参数完全相同的值,那么查询的意义何在?为什么不只对参数值进行数学计算?如果选择了多条记录会怎样? 另外,如果我工作 42 小时,我希望得到 43 小时而不是 3 小时的报酬。也就是说,GROSS_PAY 肯定应该等于 ((40 * wage_rate) + (((hours_worked-40) * wage_rate) * 1.5)) 【参考方案1】:

您的问题是INTO 子句——它只在语句中声明一次:

SELECT ph.wage_rate,
       ph.hrs_worked
  INTO t_wage, t_hours
  FROM PAY_HISTORY ph
 WHERE ph.wage_rate = p_wage_rate
   AND ph.hrs_worked = p_hrs_worked;

变量的填充基于 SELECT 子句中声明的列的顺序。

完全重写:

如果你从hours_worked 中减去 40,同时也是 40,那么你只是乘以零。并且您想将直接时间支出添加到加班费中......

CREATE OR REPLACE FUNCTION gr_pay_hrly (p_wage_rate IN NUMBER, 
                                        p_hrs_worked IN NUMBER)
RETURN NUMBER IS

  t_gross_pay NUMBER(10,2);

BEGIN

  SELECT CASE 
           WHEN ph.hrs_worked > 40 THEN ((ph.hrs_worked - (ph.hrs_worked - 40)) * ph.wage_rate) + (ph.hrs_worked - 40) * ph.wage_rate * 1.5
           WHEN ph.hrs_worked <= 40 THEN ph.hrs_worked * ph.wage_rate
           ELSE 0
         END
    INTO t_gross_pay
    FROM PAY_HISTORY ph
   WHERE ph.wage_rate = p_wage_rate
     AND ph.hrs_worked = p_hrs_worked;

  RETURN t_gross_pay;

END;

【讨论】:

以上是关于sql语句被忽略并且找不到关键字的主要内容,如果未能解决你的问题,请参考以下文章

自定义 SQL 函数 - PL/SQL:语句被忽略

SQL之检索数据(select语句)

SQL之检索数据(select语句)

为啥这个 SQL 会告诉我“在预期的地方找不到 FROM 关键字”?

第四章 检索数据

在 Oracle SQL 中使用 CTE(ORA-00923:在预期的地方找不到 FROM 关键字)