¿Cómo cargar una gran cantidad de cadenas para que coincidan con la base de datos Oracle?

Resuelto user2228135 asked hace 8 años • 3 respuestas

Actualmente estoy aprendiendo PL/SQL, así que todavía soy un novato. Supongamos que tiene una base de datos de producción a la que se conecta mediante el desarrollador Oracle SQL. SOLO tiene privilegios de LECTURA para esas bases de datos. Por lo tanto, no puede crear ni editar ninguna tabla.

Mi pregunta es, si tengo una lista grande de ID que tengo que unir con una tabla en esa base de datos, ¿cómo puedo hacerlo?

Obviamente, puedo cargar los ID en una tabla temporal y luego unirme, pero eso sería muy tedioso ya que solo tengo privilegios de LECTURA. Codificar las ID tampoco es una opción, porque la lista es demasiado grande.

Y también tenga en cuenta que conozco el concepto de tablas TEMPORALES. Pero desafortunadamente, tampoco tengo privilegios para crearlos.

¿Existe alguna solución en el desarrollador de SQL donde pueda cargar la lista de ID para que coincida con la tabla en la base de datos?

user2228135 avatar Jan 10 '16 04:01 user2228135
Aceptado

Usa una colección

VARIABLE cursor REFCURSOR;

DECLARE
  your_collection SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST();
BEGIN
  your_collection.EXTEND( 10000 );

  FOR i IN 1 .. 10000 LOOP
    -- Populate the collection.
    your_collection(i) := DBMS_RANDOM.STRING( 'x', 20 );
  END LOOP;

  OPEN :cursor FOR
  SELECT t.*
  FROM   your_table t
         INNER JOIN
         TABLE( your_collection ) c
         ON t.id = c.COLUMN_VALUE;
END;
/

PRINT cursor;

O haciendo lo mismo vía java:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.jdbc.OraclePreparedStatement;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;

public class TestDatabase2 {
    public static void main(String args[]){
        try{
            Class.forName("oracle.jdbc.OracleDriver");

            Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","username","password");

            String[] ids = { "1", "2", "3" };

            ArrayDescriptor des = ArrayDescriptor.createDescriptor("SYS.ODCIVARCHAR2LIST", con);

            PreparedStatement st = con.prepareStatement("SELECT t.* FROM your_table t INNER JOIN TABLE( :your_collection ) c ON t.id = c.COLUMN_VALUE");

            // Passing an array to the procedure - 
            ((OraclePreparedStatement) st).setARRAYAtName( "your_collection", new ARRAY( des, con, ids ) );
            ResultSet cursor = st.executeQuery();

            while ( cursor.next() )
            {
                int id = cursor.getInt(1);
                double column1 = cursor.getDouble(2);
                double column2 = cursor.getDouble(3);

                System.out.println( String.format( "Id: %5d", id ) );
                System.out.println( String.format( "  Column1: %s", column1 ) );
                System.out.println( String.format( "  Column2: %s", column2 ) );
            }
        } catch(ClassNotFoundException | SQLException e) {
            System.out.println(e);
        }
    }
}
MT0 avatar Jan 09 '2016 22:01 MT0