Как загрузить большое количество строк, чтобы соответствовать базе данных оракула?
В настоящее время я изучаю PL/SQL, поэтому я все еще новичок. Предположим, у вас есть производственная база данных, к которой вы подключаетесь с помощью разработчика Oracle SQL. У вас есть ТОЛЬКО ЧИТАЙТЕ привилегии к этим базам данных. Поэтому вы не можете создавать или редактировать любые таблицы.
Мой вопрос: если у меня есть большой список идентификаторов, к которому я должен присоединиться с таблицей в этой базе данных, как я могу это сделать?
Очевидно, что я могу загрузить идентификаторы во временную таблицу и затем выполнить соединение, но это было бы очень утомительно, поскольку у меня есть только права READ. Жесткое кодирование идентификаторов также не подходит, поскольку список слишком велик.
И также обратите внимание, что я знаю концепцию временных таблиц. Но, к сожалению, у меня тоже нет привилегий на их создание.
Есть ли какое-либо решение в SQL-разработчике, где я могу загрузить список идентификаторов, чтобы соответствовать таблице в базе данных?
3 ответа
Использовать коллекцию
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;
Или делать то же самое через 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);
}
}
}
Вы можете попробовать выполнить поиск, построив запрос следующим образом:
SELECT * FROM YourTable WHERE ID IN (Id1, Id2, ...., Idn)
Это ограничено 1000 идентификаторами, но его можно обойти, используя этот маленький трюк, показанный здесь.
Ваш дружественный dba может сопоставить каталог для использования, что позволит вам поместить туда свой файл и рассматривать его как таблицу. Затем в основном вы присоединяетесь к файлу в виде таблицы. Спросите своего администратора базы данных о EXTERNAL_TABLES.