PLS-00103:遇到符号"("当期待下列之一时:

时间:2014-12-15 20:05:22

标签: oracle plsql plsqldeveloper

我正在尝试从报表页面检索客户ID pk列到表单页面,只要用户使用oracle application express从报表页面移动到表单页面,该页面就会自动递增。所以我试图创建一个触发器返回一个具有最后一行值的数字以及+1增量。但是我得到了这个错误

Error at line 8: PLS-00103: Encountered the symbol "(" when expecting one of the following:
   , from
6. INTO number
7. FROM (SELECT a.cust_id, max(cust_id) over() as max_pk FROM customer a)
8. WHERE cust_id = max_pk;
9. number:=(cust_id+1);
10. END;

这是我的PL / SQL程序。

CREATE OR REPLACE FUNCTION cust_id_incremental(cust_id IN number)
RETURN number;


BEGIN

SELECT cust_id
INTO number
FROM (SELECT a.cust_id, max(cust_id) over() as max_pk FROM customer a)
WHERE cust_id = max_pk;`enter code here`
number:=(cust_id+1);

END;

2 个答案:

答案 0 :(得分:4)

number是一个保留字,您需要将其称为l_number之类的其他字符作为变量名称。

答案 1 :(得分:2)

您需要定义一个变量来包含结果,填充它,然后返回它。更正的程序可能如下所示:

CREATE OR REPLACE FUNCTION cust_id_incremental (cust_id IN NUMBER)
   RETURN NUMBER IS
   v_cust_id NUMBER;
BEGIN
   SELECT cust_id
   INTO   v_cust_id
   FROM   (SELECT a.cust_id, MAX (cust_id) OVER () AS max_pk
           FROM   customer a)
   WHERE  cust_id = max_pk;

   v_cust_id := v_cust_id + 1;
   RETURN v_cust_id;
END;

再看一下,这个程序的结构比它需要的更复杂。除非我遗漏了某些东西,否则你可以用一个看起来像这样的程序来完成同样的事情:

CREATE OR REPLACE FUNCTION cust_id_incremental
   RETURN NUMBER IS
   v_cust_id NUMBER;
BEGIN
   SELECT MAX (cust_id) + 1
   INTO   v_cust_id
   FROM   customer a;

   RETURN v_cust_id;
END;

当我写这篇文章时,我可能会遇到命名空间问题:原始函数接受参数CUST_ID,然后查询列CUST_ID的表。查询中对CUST_ID的所有引用都将引用该列,而不是参数。如果参数有用,它就会被遮挡。


然而,你真的不应该这样做。如果两个会话同时调用此过程并将结果值插入新行,则您将遇到主键冲突。这就是序列存在的全部原因。由于序列不是事务性的,因此访问相同序列的多个会话将获得不同的值。