关于oracle:ORA-00933:SQL命令未正确结束

关于oracle:ORA-00933:SQL命令未正确结束

ORA-00933: SQL command not properly ended

我正在使用OLEDB提供程序来连接到Oracle数据库的ADO.Net。 在我的循环中,我正在执行插入操作:

1
INSERT INTO ps_tl_compleave_tbl VALUES('2626899', 0, TO_DATE('01/01/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '52', TO_DATE('01/01/2002', 'MM/DD/YYYY'), 16.000000, 24.000)INSERT INTO ps_tl_compleave_tbl VALUES('4327142', 0, TO_DATE('03/23/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '51', TO_DATE('03/23/2002', 'MM/DD/YYYY'), 0.000000, 0.000)

第一个插入成功,但是第二个插入错误:

1
ORA-00933: SQL command NOT properly ended

我究竟做错了什么?


在.net中,当我们尝试执行一个以分号结尾的Oracle SQL语句时。结果将是一个oracle错误:ora-00911:无效字符。好的,您发现一个SQL语句不需要分号,但是例如在一个字符串中执行2条SQL语句呢?

1
2
3
4
5
6
7
8
Dim db AS DATABASE = DatabaseFactory.CreateDatabase("db")
Dim cmd AS System.Data.Common.DbCommand
Dim SQL AS String =""

SQL ="DELETE FROM iphone_applications WHERE appid = 1; DELETE FROM iphone_applications WHERE appid = 2;"

cmd = db.GetSqlStringCommand(SQL)
db.ExecuteNonQuery(cmd)

上面的代码将给您同样的Oracle错误:ora-00911:无效字符。

解决此问题的方法是使用BEGINEND;语法包装您的2条Oracle SQL语句,例如:

1
SQL ="BEGIN DELETE FROM iphone_applications WHERE appid = 1; DELETE FROM iphone_applications WHERE appid = 2; END;"

礼貌:http://www.lazyasscoder.com/Article.aspx?id=89&title=ora-00911%3A+invalid+character+when+executing+multiple+Oracle+SQL+statement


在Oracle中,分号';'仅在sqlplus中使用。在使用ODBC / JDBC,OLEDB等时,请不要在语句的末尾添加分号。在上述情况下,您实际上在执行2条不同的语句,因此处理该问题的最佳方法是使用2条语句,而不是尝试合并为一条语句,因为您不能使用分号。


对我来说,您似乎在两个语句之间缺少了;
insert into ps_tl_compleave_tbl values('2626899', 0, TO_DATE('01/01/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '52', TO_DATE('01/01/2002', 'MM/DD/YYYY'), 16.000000, 24.000)
;
insert into ps_tl_compleave_tbl values('4327142', 0, TO_DATE('03/23/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '51', TO_DATE('03/23/2002', 'MM/DD/YYYY'), 0.000000, 0.000)
;
尝试添加;并告诉我们。


第一次插入后的半结肠?


Oracle SQL使用分号;作为语句结束标记。

您将需要添加;;在插入语句之后。

注意:这还假定ADODB在一次调用中将允许2次插入。

另一种选择是将两个调用都包装在一个块中,

1
2
3
4
BEGIN
      INSERT (...) INTO (...);
      INSERT (...) INTO (...);
END;

在我的循环中,我没有重新初始化StringBuilder ...因此我发布了多个insert语句。

还是要谢谢你的帮助!!


问题可能是您有一个参数变量,该变量为null插入查询中。那就是我的问题。一旦为参数指定了空字符串的默认值,它就会起作用。


除了分号问题,我强烈建议您研究绑定变量。未能使用它们可能会导致数据库性能问题。该代码也倾向于更简洁。


ADO.NET OLE DB提供程序用于常规数据访问,而您没有数据库的特定提供程序。对于Oracle数据库连接,优先于OleDbConnection使用OracleConnection等。


OLE_DB是否需要分号?大多数API都不需要它吗?


这是一个远景,但是在第一个插入中,sql日期格式对英国和美国均有效,如果Oracle DB设置为英国日期格式,则第二个插入无效,我意识到您已经使用了TO_DATE函数,但我没有看到其他...


推荐阅读

    linux监控cpu命令?

    linux监控cpu命令?,情况,系统,信息,状态,时间,实时,电脑,工具,命令,百分比,li

    linux密码更改命令?

    linux密码更改命令?,密码,系统,名称,信息,环境,命令,使用者,用户,权限,终端,L

    linux硬盘挂载命令?

    linux硬盘挂载命令?,系统,设备,信息,电脑,情况,状态,管理,数据,工具,命令,lin

    linux命令替换的字符?

    linux命令替换的字符?,命令,数据,系统,商业,字符串,文件,内容,方法,批量,字

    linux命令行大全如何?

    linux命令行大全如何?,地址,命令,基础,工作,管理,单位,数据,标准,目录,文件,l

    linux开启bnc命令?

    linux开启bnc命令?,网络,工作,酒店,电脑,光线,信息,位置,网卡,中心,价格,寝室

    图形化linux命令集?

    图形化linux命令集?,系统,工作,密码,信息,软件,地址,命令,状态,工具,电脑,lin

    linux命令行打开浏览?

    linux命令行打开浏览?,系统,网络,网址,工具,密码,首页,服务,网站,数据,地址,l

    linux使用ssh命令?

    linux使用ssh命令?,服务,系统,软件,在线,认证,地址,命令,协议,虚拟机,主机,ss

    linux禁用rm命令?

    linux禁用rm命令?,系统,命令,文件,名称,档案,工作,不了,环境,文件夹,目录,lin

    linux命令lscf?

    linux命令lscf?,系统,工作,命令,地址,基础,目录,标准,名字,密码,管理,linux系

    linux操作常用命令?

    linux操作常用命令?,工作,系统,地址,信息,命令,目录,管理,标准,基础,工具,lin

    linux关闭串口命令行?

    linux关闭串口命令行?,代码,数据,网络,软件,通信,系统,基础,平台,信息,技术,

    linux查询命令进程?

    linux查询命令进程?,系统,名称,总量,情况,状态,进程,材料,工具,电脑,数据,怎

    linux命令行设置网卡?

    linux命令行设置网卡?,系统,地址,信息,网络,工具,电脑,工作,名称,设备,网卡,l

    linux删除整个命令?

    linux删除整个命令?,命令,文件夹,不了,名称,通用,系统,数据,文件,目录,格式,l

    linux命令mv的作用?

    linux命令mv的作用?,命令,管理,系统,文件,工作,目录,互动,名称,情况,文件夹,l

    linux两个命令包起来?

    linux两个命令包起来?,系统,单位,管理,命令,文件,设计,环境,工作,代码,生产,m

    linux调整优先级命令?

    linux调整优先级命令?,策略,系统,工作,时间,实时,信息,网络,优先级,命令,中

    linux看剩余内存命令?

    linux看剩余内存命令?,系统,情况,工具,信息,分析,状态,实时,命令,内存,总量,L