sql >> Databáze >  >> RDS >> Oracle

Získávání ORA-03115:Nepodporovaný datový typ sítě nebo chyba reprezentace při načítání pole varchar z anonymního pl/sql

java.sql.SQLException:ORA-03115:nepodporovaný datový typ sítě nebo reprezentace

To je způsobeno následujícím prohlášením:

cstmt.registerOutParameter(1, OracleTypes.ARRAY);

Tento příkaz říká, že výstupem bude pole, ale nespecifikoval skutečný název typu Oracle jako třetí parametr. Další informace o tom naleznete v tomto dokumentu Oracle.

Můžeme opravit výjimku "java.sql.SQLException: ORA-03115: unsupported network datatype or representation " přidáním třetího parametru se skutečným názvem Oracle Type. Ve vašem případě je to NAMESARRAY .

cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");

Ale výše uvedený příkaz při spuštění vyvolá následující výjimku:

java.sql.SQLException:neplatný vzor názvu:SCOTT.NAMESARRAY

Je to proto, že jsme nedeklarovali typ NAMESARRAY uvnitř DB. Výše uvedená výjimka říká, že uživatel je SCOTT, ale můžete se připojit k uživateli dle vašeho výběru a vytvořit typ.

Vytváření typu v DB:

connect scott/tiger
CREATE OR REPLACE TYPE namesarray AS VARRAY(5) OF VARCHAR2(10) ;
/

Jakmile vytvoříme typ NAMESARRAY , pokud váš kód spustíme beze změny, dojde k následující chybě:

java.sql.SQLException:ORA-06550:řádek 1, sloupec 180:

PLS-00382:výraz je nesprávného typu ORA-06550:řádek 1, sloupec 173:

PL/SQL:Příkaz ignorován

Tato chyba je způsobena tím, že jsme již definovali typ na úrovni uživatele, ale pokoušíme se vytvořit typ znovu v následujícím bloku kódu:

String dequeueQuery = "DECLARE " +
            " type namesarray IS VARRAY(5) OF VARCHAR2(10); " +
            " names namesarray;" +
            "   total integer;" +
            "   BEGIN " +
            "   names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); " +
            "   ? := names;"+
            " END;";

Takže z toho musíme odstranit deklaraci typu.

String dequeueQuery = "DECLARE " +
            " names namesarray;" +
            "   total integer;" +
            "   BEGIN " +
            "   names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); " +
            "   ? := names;"+
            " END;";

Po jeho odstranění, pokud spustíme program po kompilaci, bychom měli být schopni vidět následující výstup:

Kavita
Pritam
Ayan
Rishav
Aziz

Následuje aktualizovaný program:

import java.io.*;
import java.sql.*;
import oracle.jdbc.*;

public class DBQC {
   public static void main(String[] args) {
   try {
      Connection con=null;
      Class.forName("oracle.jdbc.OracleDriver");
      String connStr = "jdbc:oracle:thin:scott/[email protected]//dbhost:1521/dbsrvc";
      con=DriverManager.getConnection(connStr);
      if(con != null)
      {
         System.out.println("Connection succeeded");

         String dequeueQuery = "DECLARE " +
            " names namesarray;" +
            "   total integer;" +
            "   BEGIN " +
            "   names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); " +
            "   ? := names;"+
            " END;";

         CallableStatement cstmt = null;
         con.setAutoCommit(false);
         cstmt =(OracleCallableStatement)con.prepareCall(dequeueQuery);

         cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");
         boolean b = cstmt.execute();
         Array arr = cstmt.getArray(1);

         String[] recievedArray = (String[]) arr.getArray();
         for (int i = 0; i < recievedArray.length; i++)
             System.out.println(recievedArray[i]);

         con.commit();
      }
      con.close();
    } catch(Exception e){e.printStackTrace();}
    }
}


  1. Jak mohu načíst seznam parametrů z uložené procedury na serveru SQL Server

  2. Omezení simultánních uživatelských relací pro konkrétní přihlášení na SQL Server

  3. Instalace SQL Server Failover Cluster -1

  4. FROM_DAYS() Příklady – MySQL