数据库是ORACLE 10G,客户端程序使用C#编写,以下是存储过程内容:
CREATE OR REPLACE PROCEDURE abc
AS
BEGIN
       null;
END;直接在PL/SQL里创建正常,但在程序中执行到服务器的时候,没有错误提示,但存储过程显示状态为不正常(出现红色小叉,也就是编译不通过的图标),直接在PL/SQL中打开存储过程,编译,通过。
请问这是为什么?

解决方案 »

  1.   

    就是在程序中按执行SELECT语句的方法执行以下的语句:
    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);
      

  2.   

    可能是session的关系吧,试试在程序中commit下虽然这个不是必要的
      

  3.   

    确实奇怪,在程序中创建其他过程也是如此吗?
    null;
    换成dbms_output.put_line('abc');这样不会c#,没法判断是否程序原因
      

  4.   

    非常奇怪,如果我将存储过程内容放在界面上一个TEXTBOX里,在程序中读取后执行到数据库则没有问题。
    但如果存储过程内容在程序中生成后直接执行到数据库则出现这种情况。
    批量试了很多存储过程,发现绝大多数(90%以上)都不能正常编译,只有极少数可以。
    但仔细检查存储过程发现在语法上都不存在问题。而且在PL/SQL里打开后执行就正常了。
    在PL/SQL里打开存储过程页面下方会有错误信息,但感觉和当前存储过程沾不上边,很是莫名其妙。贴张图方便看:
      

  5.   

    你可以在sql后面加个/试试 。或者调用调用哪个alter procedure procedurename compile
      

  6.   

    加/试过,没有用,
    使用
    alter procedure Departments_Select1 compile 提示已编译但有错误。
    但将Departments_Select1直接打开编译,通过,
    再执行alter procedure Departments_Select1 compile依然通过,我怀疑可能是字符串中有什么特殊符号的缘故,在PL/SQL中打开后就直接被转换了。
    我再查查。
      

  7.   

    这个错误信息是什么意思?Variables 
    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 
      

  8.   

    总算找到问题了。
    原来是C#中用\n\r表示回车,但ORACLE不识别\r,只要将\r替换掉就可以了。
      

  9.   

    终于搞定了。爽啊。
    200个存储过程,全部用生成器生成。
    感觉在ORACLE中写存储过程效率还是要比在SQL SERVER里低很多。
    而且很多语法不支持。
    不过有生成器就省了很多功夫了。