Oracle锁表 - '表'的语法错误

时间:2017-11-20 07:40:22

标签: oracle plsql locking

我为用户创建了一个函数,可以在表中插入一个条目。以前用户提供下一个插入的id。现在管理层希望我的功能提供下一个ID。 (ID是'AC'和6位数的组合所以我的函数必须得到最大id并添加一个。)管理层不需要竞争条件,所以我使用lock table。但是Table存在“语法错误”。为什么呢?

Syntax error for 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之前,“代码大纲”窗口显示了创建函数名称。

Code Outline

在输入LOCK TABLE时,我有:

Code Outline for <code>LOCK TABLE</code>

请注意,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没有达到我的预期。 [ /修改

0 个答案:

没有答案