我正在尝试从报表页面检索客户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;
答案 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
的所有引用都将引用该列,而不是参数。如果参数有用,它就会被遮挡。
然而,你真的不应该这样做。如果两个会话同时调用此过程并将结果值插入新行,则您将遇到主键冲突。这就是序列存在的全部原因。由于序列不是事务性的,因此访问相同序列的多个会话将获得不同的值。