Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Run Time error:-2147217887(80040e21) Sistem tidak dapat menemukan teks pesan untuk nomor pesan 0x80040e21 dalam file pesan untuk OraOLEDB

Dengan banyak parameter ini, masalahnya bisa apa saja satu item termasuk tipe data yang tidak cocok, panjang data, dll. Di sinilah seni yang dikenal sebagai debugging harus dilakukan.

  1. Periksa dengan cermat tipe data tabel (T_SAP_ZSSTABL_NEW ). Oracle mungkin memiliki tipe data yang tidak dapat segera diterjemahkan oleh Jenis ADO seperti BLOB , CLOB , BFILE , tipe numerik presisi tinggi, tipe karakter maksimum, atau tipe ekstensi (XML, media, dll.).

  2. Coba perpanjang panjang data (atau biarkan kosong dalam penetapan parameter):

    Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, 100, POSNR)
    
    Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, , POSNR)
    

    Jika perlu, periksa panjang variabel dengan Len() VBA's untuk meningkatkan peringatan pengguna sebelum menambahkan parameter.

  3. Coba jalankan SELECT versi kueri dengan parameter yang sama untuk mengembalikan satu baris hasil. Jika kesalahan yang sama terjadi, mulailah dengan param pertama, lalu tambahkan yang kedua atau 10 secara berurutan untuk mengisolasi item yang bermasalah.

    SELECT ? AS TSZ_CHARG_PARAM, ? AS TSZ_MATNR_PARAM, ? AS TSZ_MAKTX_PARAM,
           ...
    FROM T_SAP_ZSSTABL_NEW
    WHERE TSZ_VBELN = ? AND TSZ_POSNR = ?
    
  4. Refactor kode untuk konsistensi, karena Anda mungkin melewatkan satu atau tidak selaras yang dapat terjadi dengan banyak baris berulang. Selalu bidik kode DRY (Don't Repeat Yourself). Salah satu opsi adalah menggunakan kamus dengan pasangan kunci/nilai alih-alih 160+ variabel atau rentang bernama:

    Dim key As Variant
    Dim paramDict As Object
    Set paramDict = CreateObject("Scripting.Dictionary")
    
    For ...
        paramDict.Add "KeyX", "ValueX"
    Next ...
    
    ...
    
    With cmd
      .ActiveConnection = myOracleConn
      .CommandText = strSQL
      .CommandType = adCmdText
    
      For Each key In  paramDict.Keys
         .Parameters.Append .CreateParameter(key, adVarChar, adParamInput, , paramDict(key))
      Next key
    
      .Execute
    End With
    

    Jika Anda memiliki tipe campuran, coba buat kamus yang berbeda untuk setiap tipe dan ulangi secara berurutan untuk menambahkan parameter. Dan sesuaikan UPDATE dengan semua jenis yang sama di dekat satu sama lain. Ingat UPDATE tidak perlu mengikuti urutan kolom dalam definisi tabel.

  5. Jika memungkinkan (atau solusi jangka panjang), pertimbangkan untuk mendesain ulang tabel format lebar TSZ kolom ke dalam bentuk format panjang yang dinormalisasi.

    ID   POSNR   VBELN   Indicator   Value
     #     XXX     XXX       CHARG     XXX
     #     XXX     XXX       MATNR     XXX
     #     XXX     XXX       MAKTX     XXX
    ...
    

    Meskipun ini akan menambahkan 167 baris untuk setiap pengenal unik, dalam desain database, baris jauh lebih murah daripada kolom sehingga kueri akan lebih mudah, dan penyimpanan data lebih terukur, dan pemeliharaan lebih efisien. Misalnya, metrik baru tidak memerlukan kolom baru yang ditentukan dengan semua info meta tetapi hanya baris baru. Dan dengan PIVOT Oracle Anda dapat dengan mudah merender ulang format lebar.

Secara keseluruhan, tidak ada cara tunggal yang jelas untuk men-debug kesalahan runtime seperti ini yang berasal dari ekstensi API seperti koneksi database. Sintaks SQL atau referensi objek VBA dapat dengan mudah ditangani tetapi masalah khusus data memerlukan penggalian yang kreatif melalui keseluruhan proses.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Struktur data apa yang digunakan untuk mengurutkan data ini dalam PL/SQL?

  2. Bagaimana kita bisa mendapatkan interval waktu 15 menit?

  3. Bagaimana cara menampilkan proses yang berjalan di Oracle DB?

  4. Bagaimana cara mendapatkan parameter output prosedur tersimpan yang merupakan array agar berfungsi?

  5. Prosedur tersimpan Oracle dengan parameter untuk klausa IN