序列和触发器,PL/SQL
我第一次使用Oracle,更习惯于sql server及其标识。但现在我试着使用序列和触发器。但我不能纠正这个错误序列和触发器,PL/SQL,sql,oracle,triggers,sequence,Sql,Oracle,Triggers,Sequence,我第一次使用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 cont
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;';
很长一段时间,但看起来您在开始语句的引号之后和之前缺少了一个空格。序列是一个包含SQL语句但不存储数据的对象。
触发器是在表上发生操作时执行的SQL块。首先,没有明显的理由使用execute IMMEDIATE。有隐形的吗?看起来您应该删除它并直接在SQL模式下执行这些语句
接下来,您似乎忘记了使用冒号:NEW.stage\u char\u id为NULL应该是:NEW.stage\u char\u id为NULL,依此类推。为什么要使用
立即执行
?您是否有理由需要从PL/SQL而不是普通SQL动态创建它们?(事实上,您不应该在第一条动态语句的末尾使用分号,并且您的new
引用缺少一个冒号,但这些都不会导致该错误)。可以显示PL/SQL块或脚本的其余部分吗?删除代码>位于创建序列
语句的末尾。只有在创建PL/SQL过程时,使用execute immediate
时,常规SQL语句才不需要它。谢谢,这就是我最初使用它的方式,但运气不好。Blake,你能试着将语句本身(no execute immediate)键入任何用于手动与DB交互的内容吗?我正在尝试SQL小提琴,似乎还可以。获取错误:表不存在,但这意味着语法检查有效。当我这样做时,它实际上会编译,但随后我收到一个错误,该错误声明。未声明绑定变量“NEW”。