我为用户创建了一个函数,可以在表中插入一个条目。以前用户提供下一个插入的id。现在管理层希望我的功能提供下一个ID。 (ID是'AC'和6位数的组合所以我的函数必须得到最大id并添加一个。)管理层不需要竞争条件,所以我使用lock table
。但是Table
存在“语法错误”。为什么呢?
如果我编译,则没有错误消息。 (对所有人,是的,它编译。</ em>)当我在Oracle SQL Developer中测试时(我有两个实例正在运行,并选择'Run ...'来测试。),我看到两个实例都返回相同的数字(v_NextAccessCode)。
从Database SQL Reference开始,我知道该表必须位于相同的架构中。是的,我有。表和函数都在同一模式中。 (该功能在我自己的包中。)
我有以下内容:Oracle Database 12c标准版12.1.0.2.0版 - 64位生产
欢迎任何想法/建议。 ;)
FUNCTION CreateAccessCode(
i_AccessType IN VARCHAR2,
i_Description IN VARCHAR2,
...
errMsg OUT VARCHAR2)
RETURN NUMBER
v_NextAccessCode NUMBER;
v_NextACString VARCHAR2(8);
v_count NUMBER;
E_INUSE EXCEPTION;
BEGIN
-- Lock table manually
LOCK TABLE CMS_ACCESS_CODES
IN EXCLUSIVE MODE NOWAIT;
SELECT TO_CHAR(SUBSTR(MAX(ACCESS_CODE), 3, LENGTH(MAX(ACCESS_CODE)) - 2) + 1)
INTO v_NextAccessCode
FROM CMS_ACCESS_CODES;
v_NextACString := 'AC' || v_NextAccessCode;
SELECT COUNT(*)
INTO v_count
FROM CMS_ACCESS_CODES
WHERE ACCESS_CODE = v_NextACString;
IF v_count > 0 THEN
errMsg := 'Another user may be creating an access code now. '
|| 'Please try again later.';
RAISE E_INUSE;
END IF;
INSERT INTO CMS_ACCESS_CODES (ACCESS_CODE, ACCESS_TYPE, DESCRIPTION)
VALUES (v_NextACString, i_AccessType, i_Description);
-- Release lock
COMMIT;
RETURN v_NextAccessCode;
[编辑]亲爱的,奇怪的是,我的SQL Developer报告了语法错误。在添加LOCK TABLE
之前,“代码大纲”窗口显示了创建函数名称。
在输入LOCK TABLE
时,我有:
请注意,ID是'AC'和6位数的组合。所以我的函数必须得到最大ID并添加一个。
我的SQL Developer版本是4.2.0.17.089 Build 17.089.1709。请查看最新版本是2017年10月17日更新的版本17.3.1.279.0537。(来自SQL Developer Download)
我不知道还有什么我可以告诉你我说你看到语法错误但编译好了。但是当我测试时,LOCK TABLE
没有达到我的预期。
[ /修改