Einleitung:
Beim Umgang mit großen Datensätzen müssen Sie Zeichenfolgen effizient mit den in der Datenbank gespeicherten Daten abgleichen. In diesem Artikel werden Alternativen zu herkömmlichen Ansätzen mit eingeschränkten Datenbankberechtigungen untersucht, die die Erstellung temporärer Tabellen oder die direkte Manipulation von Datenbankstrukturen verhindern.
Problemstellung:
Wie kann man eine große Liste von String-IDs effizient einer Tabelle in einer Oracle-Datenbank zuordnen, wenn man nur Lesezugriff hat? Aufgrund der Größe der Liste ist eine Hardcodierung von IDs nicht möglich.
Option 1: Sammlungen verwenden
Oracle bietet einen Mechanismus namens „Sets“, der als Alternative zu temporären Tabellen verwendet werden kann. Eine Sammlung ist eine Datenstruktur, die eine Reihe von Werten enthalten kann. In diesem Beispiel kann die Sammlung mit Zeichenfolgen-IDs gefüllt werden. Der folgende PL/SQL-Codeausschnitt zeigt, wie Sammlungen verwendet werden:
<code class="language-sql">VARIABLE cursor REFCURSOR; DECLARE your_collection SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST(); BEGIN your_collection.EXTEND( 10000 ); FOR i IN 1 .. 10000 LOOP -- 填充集合。 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;</code>
Option 2: Java-Arrays verwenden
Wenn Java verfügbar ist, kann dieselbe Methode über Java-Code implementiert werden. Der folgende Codeausschnitt zeigt, wie ein Java-Array verwendet wird, um eine Liste von String-IDs an eine SQL-Abfrage zu übergeben:
<code class="language-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"); // 将数组传递给过程 - ((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); } } }</code>
Beide Optionen bieten eine effiziente Möglichkeit, große Listen von String-IDs mit Daten in einer Oracle-Datenbank abzugleichen, ohne dass temporäre Tabellen oder Änderungen an der Datenbankstruktur erforderlich sind.
Das obige ist der detaillierte Inhalt vonWie kann man große String-Listen effizient mit einer Oracle-Datenbank abgleichen, indem man nur Leserechte verwendet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!