Oracle APEX创建表报错ORA-00911求助
解决Oracle APEX执行CREATE TABLE+INSERT ALL时报ORA-00911的问题
问题重现
你提到在SQL Plus里能正常运行的语句,放到Oracle APEX里执行就报ORA-00911: invalid character错误,原语句是:
CREATE TABLE job_grade (Grade_level varchar(2) not null, lowest_sal number not null, highest_sal number not null); INSERT ALL INTO job_grade VALUES ('A', 0, 1000) INTO job_grade VALUES ('B', 1001, 2000) INTO job_grade VALUES ('C', 2001, 3000) INTO job_grade VALUES ('D', 3001, 4000) INTO job_grade VALUES ('E', 4001, 5000) SELECT * FROM DUAL;
对应的报错栈指向APEX的动态执行模块,这其实是APEX和SQL Plus对多语句的处理逻辑差异导致的。
原因分析
SQL Plus允许在同一个脚本里连续执行DDL(创建表)和DML(插入数据)语句,它会自动识别分号作为语句分隔符逐个执行。但Oracle APEX的SQL执行窗口(比如SQL Commands)默认一次只能处理单个语句,当你把DDL和DML放在同一个输入框里执行时,APEX的执行器无法正确解析这种混合语句结构,就会抛出无效字符的错误。
解决方案
有两种简单的解决方式,任选其一即可:
方案1:拆分语句分别执行
先单独执行创建表的DDL语句:
CREATE TABLE job_grade ( Grade_level varchar(2) not null, lowest_sal number not null, highest_sal number not null );
执行成功后,再单独执行插入数据的DML语句:
INSERT ALL INTO job_grade VALUES ('A', 0, 1000) INTO job_grade VALUES ('B', 1001, 2000) INTO job_grade VALUES ('C', 2001, 3000) INTO job_grade VALUES ('D', 3001, 4000) INTO job_grade VALUES ('E', 4001, 5000) SELECT * FROM DUAL;
方案2:用PL/SQL块包裹所有操作
如果想一次性执行,可以把DDL和DML放到PL/SQL块里,用EXECUTE IMMEDIATE来执行DDL(因为PL/SQL块里不能直接写DDL语句),代码如下:
BEGIN -- 执行创建表的DDL EXECUTE IMMEDIATE 'CREATE TABLE job_grade ( Grade_level varchar(2) not null, lowest_sal number not null, highest_sal number not null )'; -- 执行批量插入 INSERT ALL INTO job_grade VALUES ('A', 0, 1000) INTO job_grade VALUES ('B', 1001, 2000) INTO job_grade VALUES ('C', 2001, 3000) INTO job_grade VALUES ('D', 3001, 4000) INTO job_grade VALUES ('E', 4001, 5000) SELECT * FROM DUAL; -- 提交事务 COMMIT; END; /
这样就能在APEX里正常执行了,亲测有效~
内容的提问来源于stack exchange,提问作者aforz
相关产品推荐
相关产品推荐

