sql - transponer - ¿Cómo cargar una gran cantidad de cadenas para que coincida con la base de datos Oracle?
oracle transponer registros columnas (3)
Actualmente estoy aprendiendo PL / SQL, así que todavía soy un novato. Suponga que tiene una base de datos de producción, a la que se conecta utilizando el desarrollador Oracle SQL. SOLO has LEÍDO los privilegios de esas bases de datos. Por lo tanto, no puede crear ni editar ninguna tabla.
Mi pregunta es, si tengo una gran lista de ID, que debo unir con una tabla en esa base de datos, ¿cómo puedo hacer eso?
Obviamente, puedo cargar los ID en una tabla temporal y luego hacer una unión, pero eso sería realmente tedioso ya que solo tengo privilegios de LECTURA. Codificar los ID no es una opción tambié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.
¿Hay 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?
Puedes intentar hacer la búsqueda construyendo una consulta como esta:
SELECT * FROM YourTable WHERE ID IN (Id1, Id2, ...., Idn)
Esto está limitado a 1000 Ids, pero se puede evitar usando este pequeño truco que se muestra here .
Su amigable dba puede asignar un directorio para que lo use, que le permitirá colocar su archivo allí y tratarlo como una tabla. Entonces, básicamente, te unes con el archivo como tabla. Pregúntele a su DBA sobre EXTERNAL_TABLES.
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 a través de 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);
}
}
}