plsql 动态sql遇到ORA-00911: invalid character错误

来源:互联网 发布:qq炫舞神域名片夹底图 编辑:程序博客网 时间:2024/06/11 10:19

关键词 PLSQL 分号
前些日子在学习plsql写一个包的时候遇到一个小问题。
具体为:程序读取表中的数据拼装ddl 语句 然后动态sql执行,结果报错
CODE:-911 ERROR:ORA-00911: invalid character
具体拼接完成的代码如下(因为是直接输出的拼接代码含有转义字符所以会有两个分号:“ ” ”)

-- Create table  qyzcfzzbcreate table qyzcfzzb(jlbh NUMBER(10) NOT NULL,qynsrsbh VARCHAR2(20) NOT NULL,zchj NUMBER )  tablespace DATA_CW  pctfree 10  initrans 1  maxtrans 255;  -- Add comments to the columns  comment on column qyzcfzzb.jlbh     IS ''BIANHAO'';    comment on column qyzcfzzb.qynsrsbh     IS ''NSRSBH'';    comment on column qyzcfzzb.zchj     IS ''CAIWUHEJI'';    -- Create primary key constraints      alter table qyzcfzzb      add constraint PK_qyzcfzzb_BH primary key (jlbh)      using index  tablespace DATA_CW  pctfree 10  initrans 2  maxtrans 255;

错误代码的本意是无效字符,许多博客上说的方法也是动态执行sql语句的解释器不能识别末尾的分号,我尝试去掉分号发现还是不行,然后就查是否有语言拼写错误的地方,然而还是找不到。

后来才恍然大悟,动态解释器不识别分号,那么我在一些可视化工具中习惯用的用分号分隔多个sql语句的习惯也不能用于这里,也就是说,本质上是对于纯sql语句(相对于plsql而言),动态执行就是一次一句,类似于plsql-dev这些可视化管理工具,从它的运行提示也可以看出,它也是利用分号分开提取各个单独的sql语句,然后依次提交给解释器执行的。

那么我如果要跑这一段语句,有两种方法,以将其改写为带有begin end 的plsql语句,或者将这一段中的每个语句单独执行所有语句末尾都不带分号。

结语:我从学习oracle开始就一直使用的可视化工具,一直就是多条sql语句分号隔开的方式写东西,其实有些地方还是需要注意,某些做法只能在可视化工具中使用。