【问题标题】:Sequence and Trigger, PL/SQL序列和触发器,PL/SQL
【发布时间】:2013-07-07 16:16:03
【问题描述】:

我是第一次使用 Oracle,更习惯于使用 sql server 及其身份。但现在我正在尝试使用序列和触发器。但是不断收到这个我无法修复的错误。

identifiers may not start with any ASCII character other than
       letters and numbers.  $#_ are also allowed after the first
       character.  Identifiers enclosed by doublequotes may contain
       any character other than a doublequote.  Alternative quotes
       (q'#...#') cannot use spaces, tabs, or carriage returns as
       delimiters.  For all other contexts, consult the SQL Language
       Reference Manual.

任何人都可以帮助解决它,这是我的代码。

EXECUTE IMMEDIATE' CREATE SEQUENCE stagechardata_stagecharid
     START WITH 1 
     INCREMENT BY 1;';  

EXECUTE IMMEDIATE' CREATE OR REPLACE TRIGGER stagechardata_stagecharid_TRG
     BEFORE INSERT 
     ON stage_char_data
     FOR EACH ROW
     BEGIN
     IF NEW.stage_char_id IS NULL THEN
        SELECT stagechardata_stagecharid.NEXTVAL INTO NEW.stage_char_id
          FROM DUAL;
          END IF;
     END;';

【问题讨论】:

  • 你为什么使用execute immediate?您是否有理由需要从 PL/SQL 而不是普通 SQL 动态创建这些? (事实上​​,您不应该在第一个动态语句的末尾使用分号,并且您的 new 引用缺少冒号,但这些不会导致该错误)。你能展示剩下的 PL/SQL 块或脚本吗?
  • 删除create sequence 语句末尾的;。使用 execute immediate 时,常规 SQL 语句不需要它,仅在创建 PL/SQL 过程时才需要。

标签: sql oracle triggers sequence


【解决方案1】:

首先,没有明显的理由使用 EXECUTE IMMEDIATE。有没有看不见的?看来你应该把它去掉,直接在 SQL 模式下执行这些语句。

接下来,您好像忘记使用冒号了:NEW.stage_char_id IS NULL 应该是 :NEW.stage_char_id IS NULL 等等。

【讨论】:

    【解决方案2】:

    序列是一个包含 SQL 语句但不存储数据的对象。 触发器是在对表进行操作时执行的 SQL 块。

    【讨论】:

      【解决方案3】:

      远射,但看起来您在 IMMEDIATE 之后和开始声明的引号之前缺少一个空格。

      【讨论】:

      • 谢谢,我原来就是这样,但运气不好。
      • 布莱克,您可以尝试将语句本身(不立即执行)输入到您用来手动与数据库交互的任何内容中吗?我正在尝试使用 SQL Fiddle,似乎还可以。收到表不存在的错误,但这意味着语法检查有效。
      • 当我这样做时,它实际上会编译,但随后我收到一条错误消息。未声明绑定变量“NEW”。
      猜你喜欢
      • 2018-08-07
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 2017-09-14
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多