0

次のストアドプロシージャがあります

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

これには2つの問題があります。

最初の問題:アプリケーションのある時点で、valor(Visual Basic 関数の) パラメーターをスペースを含む文字列として持っています。これは、「スペースを含む文字列」のようなものです。この場合、ストアド プロシージャはテーブルを更新しません。DBで(SQL Developerを使用して)SPを直接実行すると、すべて正常に動作します。いくつかの引用符( ')が欠落している文字列と関係があることは知っていますが、まだ機能させていません。これに関するいくつかのアイデアはありますか?

2 番目の問題:アプリケーションのデバッグ中に実行を中断すると、再度実行しようとするたびにORA-24338 'ステートメント ハンドルが実行されていません' エラーが何時間も発生することがあります。オープントランザクションと関係があると思います。しかし、正直なところ、私は Oracle を使用するのは初めてなので、何が問題なのかまったくわかりません。

手伝って頂けますか?

更新: ORA-24338 の本当の理由を見つけました。エラーの原因となったのは別の SP でした。他の問題の解決策を見つけたら、ここにすべて投稿します。

4

1 に答える 1

2

WHEN OTHERS 句を、予想されるエラーを具体的に指定する句に置き換えるか、エラーを処理した後にエラーを発生させることをお勧めします。WHEN OTHERS は、実際の問題を隠すことで悪名高いため、少し物議を醸しています。

于 2009-12-09T10:34:17.887 に答える