【问题标题】:PLS-00103: Encountered the symbol "(" when expecting one of the following:PLS-00103:在预期以下情况之一时遇到符号“(”:
【发布时间】:2014-12-18 16:12:15
【问题描述】:

我正在尝试将客户 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;

【问题讨论】:

  • 这是一种糟糕的填充主键的方法。您将不可避免地有多个会话同时生成相同的 ID
  • 那么你有什么推荐的。我应该为我的 pk 列创建一个序列吗?
  • 是的,您应该使用序列。这就是他们的目的。

标签: oracle plsql plsqldeveloper


【解决方案1】:

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

【讨论】:

  • 并且需要定义变量。
  • 变量号确实需要改,但是已经定义了,因为它是一个IN参数。
  • 是的。我使用'sum'作为变量名,后来改成了l_sum。它有效。
【解决方案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 的所有引用都将引用列,而不是参数。如果参数有目的,它就会被遮蔽。


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

【讨论】:

  • 感谢它的工作。我怎么忘了我们需要给它添加一个变量。,傻我?再次感谢您的支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 2014-09-18
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多