代码之家  ›  专栏  ›  技术社区  ›  Edgar Hernandez

.NET Oracle ORA-24338“语句句柄未执行”错误和一个存储过程中的某些错误

  •  0
  • Edgar Hernandez  · 技术社区  · 15 年前

    我有以下存储过程

    create or replace PROCEDURE WEB_AC
    (
      v_iDocid IN NUMBER DEFAULT NULL ,
      v_valor IN VARCHAR2 DEFAULT NULL ,
      v_campo IN VARCHAR2 DEFAULT NULL ,
      v_error  OUT NUMBER
    )
    AS
    v_campoid NUMBER(5,0);
    v_tipodato VARCHAR2(50);
    v_DOCTYPE NUMBER;
    v_tabla VARCHAR2(50);
    v_procedure VARCHAR2(70);
    BEGIN
      v_error:= 0;
      IF v_valor IS NULL
        OR v_valor IS NULL
        OR LENGTH(TRIM(v_valor)) = 0 THEN
           BEGIN
               v_error:= 3;
    
           END;
      else   
       Begin
          bEGIN
            SELECT campoid,
                doctype,
              tipodato
            INTO v_campoid,
              v_DOCTYPE,
              v_tipodato
            FROM TiposDocumento t
                , DIGITALIZAMAIN d
                , CatCamposDocumento c
            where
                c.tabla=t.tabla and
             nombre=v_campo and
             doctype = TipoDocumentoID and
             docid = v_iDocid AND 
             Mostrar = 1;
            EXCEPTION
              WHEN OTHERS THEN
                v_campoid := 0;
          END;
        --select @campoid
           IF v_campoid != 0 THEN
             Begin
                  EXECUTE IMMEDIATE 'BEGIN ABANCE3.WEB_UPDOC' || TRIM(TO_CHAR(v_DOCTYPE )) || 'C' || TRIM(TO_CHAR(v_campoid)) ||'(' ||
                 TO_CHAR (v_iDocid)||' , '||CHR(39)||v_valor||CHR(39)||',:2);END;'  
                    USING out v_error;
    
          END;
        END IF;
        end;
      end if;  
     END;  
    

     create or replace PROCEDURE WEB_UPDOC1C6(v_idreg NUMBER,v_valor VARCHAR2,v_temp OUT NUMBER) 
     AS
       v_sys_error NUMBER := 0;
        BEGIN
          BEGIN
           SELECT count(*)
             INTO v_sys_error
             FROM DOC1
             where DOCID = v_idreg;
             EXCEPTION WHEN OTHERS THEN v_sys_error:=0;
           END;
    
    
           IF v_sys_error > 0 THEN
             BEGIN
               BEGIN
                 UPDATE DOC1
                   SET DESCRIPCION = v_valor
                   WHERE  DOCID = v_idreg;
                  EXCEPTION WHEN OTHERS THEN v_sys_error:=0;
              END;
             IF v_sys_error = 0 THEN v_temp:=0 ;
             ELSE v_temp:=1 ;
             END IF;
           END;
         END IF;
       END;
    

    我从一个应用程序调用它们,代码如下:

     Friend Function ActualizaCampos(ByVal iDocID As Long, ByVal valor As String, ByVal Campo As String, ByVal ProyectoID As Integer) As String
             Dim mstrCS as String = "Here goes the connection String to my server"
             Dim db As Database
             Dim dbCW As DbCommand
             Dim iValor As String = "0"
    
        Select Case Me.TipoBD
                 Case GlobalDef.eTipoBD.Oracle
                     db = New OracleDatabase(mstrCS)
                     dbCW = db.GetStoredProcCommand(WEB_AC, iDocid, valor, Campo, 0)
                     db.ExecuteNonQuery(dbCW)
                 Case GlobalDef.eTipoBD.SQLServer
                     db = New SqlDatabase(mstrCS)
                     dbCW = db.GetStoredProcCommand(WEB_AC, iDocid, valor, Campo)
                     iValor = db.ExecuteScalar(dbCW).ToString()
             End Select
    
             Return iValor
         End Function
    

    在这个例子中, WEB_AC SP 始终执行SP WEB_UPDOC1C6

    我有两个问题。

    第一个问题: 在应用程序的某个时刻,我有 valor 参数(在VisualBasic函数中)是一个字符串,其中包含类似于 “一些带空格的字符串” . 发生这种情况时,存储过程不会更新表。如果我直接在数据库中执行sp(使用SQL开发人员),一切都可以正常工作。我知道这与缺少引号(“)的字符串有关,但我还没有使它起作用。有什么想法吗?

    第二个问题: 有时,在调试应用程序时,如果我中断了执行,我就开始获取 ORA-24338“未执行语句句柄”错误 每次我尝试再次执行它,都要花上几个小时。我相信这与一笔未结交易有关。但老实说,由于我刚接触甲骨文,我真的不知道问题可能是什么。

    你能帮助我吗?

    更新: 我找到了ORA-24338的真正原因。导致错误的是另一个SP。当我找到其他问题的解决方案时,我会把它全部贴在这里。

    1 回复  |  直到 8 年前
        1
  •  2
  •   David Aldridge    15 年前

    我建议您将when-others子句替换为一个专门命名您所期望的错误的子句,或者在处理完错误后提出错误。当其他人有点反复无常时,因为隐藏真正的问题而臭名昭著。