请看一下下面的创建触发器的sql语句,在plsql下面执行没有问题,但是我放到java程序里执行时就发生错误,错误提示是java.sql.SQLException: 索引中丢失  IN 或 OUT 参数:: 1
运行的环境是weblogic813+oracle10g,通过weblogic获得数据库连接,在ejb中执行
请高手帮忙看看这是怎么回事儿,谢谢!CREATE OR REPLACE TRIGGER USER1.AA
  BEFORE insert ON USER1.TABLE1
  FOR each row
BEGIN
  IF INSERTING THEN
    INSERT INTO USER2.BB
      (C1,
       C2,
       C3,
       C4)
    VALUES
      ('2A',
       :NEW.C2,
       :NEW.C3,
       :NEW.C4);
  END IF;  
END AA;

解决方案 »

  1.   

    java 程序大致是下面这样的:
    StringBuffer sb = new StringBuffer(1024);        sb.append("CREATE OR REPLACE TRIGGER USER1.AA ")          
              .append("BEFORE insert ON USER1.TABLE1 ")          
              .append("FOR each row ")
              .append("BEGIN ")
              .append("IF INSERTING THEN ")
              .append("INSERT INTO USER2.BB(C1, C2, C3, C4) ")
              .append("VALUES('2A', :NEW.C2, :NEW.C3, :NEW.C4);")          
              .append("END IF; ")          
              .append("END SYN_GROUPS_ENTRY;");
              
    Connection con = null;
    PreparedStatement pstmt = null;
    try {
        con = JNDIConfiguration().getDbAdminConnection();
        pstmt = conn.prepareStatement(sb.toString();   
        pstmt.executeUpdate();
    }
    catch()
    finally {
    }
      

  2.   

    哈哈,我想我知道原因了。LZ应该是用了PreparedStatement类,这个呢,她会动态分析里面的参数,就是冒号后面的。
    被他认为了是参数,但是因为你没有设置参数,所以,有这个错误。直接用Statement.executeQuery(sql)就可以了,她不会解析参数的。赫赫。
      

  3.   

    pstmt   =   conn.prepareStatement(sb.toString());      
    上面漏了半边括号
      

  4.   

    果然,是用了PreparedStatement。
      

  5.   

    其实两个类就是分别对静态SQL和动态SQL的区别。动态的时候,冒号后面的,会被认为是参数,会检查参数的设置。
      

  6.   

    楼上真是高手啊,换了Statement就好了,谢谢!