소개:
대규모 데이터 세트를 처리할 때는 문자열을 데이터베이스에 저장된 데이터와 효율적으로 일치시켜야 합니다. 이 문서에서는 임시 테이블 생성이나 데이터베이스 구조의 직접 조작을 방지하는 제한된 데이터베이스 권한을 사용하는 기존 접근 방식에 대한 대안을 살펴봅니다.
문제 설명:
읽기 액세스 권한만 있는 경우 Oracle 데이터베이스의 테이블에 대규모 문자열 ID 목록을 효율적으로 일치시키는 방법은 무엇입니까? 목록의 크기로 인해 ID를 하드코딩하는 것은 불가능합니다.
옵션 1: 컬렉션 사용
Oracle은 임시 테이블 대신 사용할 수 있는 "세트"라는 메커니즘을 제공합니다. 컬렉션은 일련의 값을 보유할 수 있는 데이터 구조입니다. 이 예에서 컬렉션은 문자열 ID로 채워질 수 있습니다. 다음 PL/SQL 코드 조각은 컬렉션 사용 방법을 보여줍니다.
<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>
옵션 2: Java 배열 사용
Java를 사용할 수 있는 경우 Java 코드를 통해서도 동일한 메소드를 구현할 수 있습니다. 다음 코드 조각은 Java 배열을 사용하여 문자열 ID 목록을 SQL 쿼리에 전달하는 방법을 보여줍니다.
<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>
두 옵션 모두 임시 테이블이나 데이터베이스 구조 수정 없이 대규모 문자열 ID 목록을 Oracle 데이터베이스의 데이터와 일치시키는 효율적인 방법을 제공합니다.
위 내용은 읽기 권한만 사용하여 대규모 문자열 목록을 Oracle 데이터베이스와 효율적으로 일치시키는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!