数据库是ORACLE 10G,客户端程序使用C#编写,以下是存储过程内容:
CREATE OR REPLACE PROCEDURE abc
AS
BEGIN
null;
END;直接在PL/SQL里创建正常,但在程序中执行到服务器的时候,没有错误提示,但存储过程显示状态为不正常(出现红色小叉,也就是编译不通过的图标),直接在PL/SQL中打开存储过程,编译,通过。
请问这是为什么?
CREATE OR REPLACE PROCEDURE abc
AS
BEGIN
null;
END;直接在PL/SQL里创建正常,但在程序中执行到服务器的时候,没有错误提示,但存储过程显示状态为不正常(出现红色小叉,也就是编译不通过的图标),直接在PL/SQL中打开存储过程,编译,通过。
请问这是为什么?
CREATE OR REPLACE PROCEDURE abc
AS
BEGIN
null;
END; 按理说这个时候应该是在数据库中创建了存储过程abc ,但实际上abc 的确是出现在了数据库中,但状态为没有编译通过的状态。C#的代码贴出供参考:
dbcon.CommandType = CommandType.Text;
strSql = @"CREATE OR REPLACE PROCEDURE abc
AS
BEGIN
null;
END;";
dbcon.ExecuteNonQuery(strSql);
null;
换成dbms_output.put_line('abc');这样不会c#,没法判断是否程序原因
但如果存储过程内容在程序中生成后直接执行到数据库则出现这种情况。
批量试了很多存储过程,发现绝大多数(90%以上)都不能正常编译,只有极少数可以。
但仔细检查存储过程发现在语法上都不存在问题。而且在PL/SQL里打开后执行就正常了。
在PL/SQL里打开存储过程页面下方会有错误信息,但感觉和当前存储过程沾不上边,很是莫名其妙。贴张图方便看:
使用
alter procedure Departments_Select1 compile 提示已编译但有错误。
但将Departments_Select1直接打开编译,通过,
再执行alter procedure Departments_Select1 compile依然通过,我怀疑可能是字符串中有什么特殊符号的缘故,在PL/SQL中打开后就直接被转换了。
我再查查。
Object type = %
Object owner = DEVELOP
Object name = % Type PROCEDURE
Owner DEVELOP
Name ABC
Line Error text
1 PLS-00103: 出现符号 ""在需要下列之一时:
( ; is with authid as cluster
compress order using compiled wrapped external deterministic
parallel_enable pipelined
原来是C#中用\n\r表示回车,但ORACLE不识别\r,只要将\r替换掉就可以了。
200个存储过程,全部用生成器生成。
感觉在ORACLE中写存储过程效率还是要比在SQL SERVER里低很多。
而且很多语法不支持。
不过有生成器就省了很多功夫了。