복붙노트

[SQL] 어떻게 오라클 데이터베이스와 일치하는 문자열의 큰 숫자를로드 할?

SQL

어떻게 오라클 데이터베이스와 일치하는 문자열의 큰 숫자를로드 할?

난 아직 안돼서 그래서 저는 현재 PL / SQL을 배우고있다. 당신이 오라클 SQL 개발자를 사용하여 연결 프로덕션 데이터베이스를 가지고 있다고 가정합니다. 당신은 그 데이터베이스에 privilges을 읽었습니다. 따라서 당신은 어떤 테이블을 만들거나 편집 할 수 없습니다.

내가 그 데이터베이스의 테이블에 가입해야 ID의 큰 목록이있는 경우 내 질문에 내가 그렇게 할 수있는 방법이다?

분명히, 나는 임시 테이블에 ID를로드 할 수 있습니다 후 가입,하지만 난 단지 읽기 권한으로 그건 정말 지루한 것입니다. 목록이 너무 크기 때문에 ID를 하드 코딩하는 것은, 또한 옵션이 아닙니다.

또한 내가 임시 테이블의 개념을 알고, 그주의. 그러나 불행하게도, 나는 또한 사람들을 만들 수있는 권한이 없습니다.

나는 데이터베이스의 테이블과 일치하는 ID의 목록을로드 할 수 있습니다 SQL 개발자의 모든 솔루션이 있습니까?

해결법

  1. ==============================

    1.컬렉션을 사용하여

    컬렉션을 사용하여

    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);
            }
        }
    }
    
  2. ==============================

    2.이 같은 쿼리를 구성하여 검색을 수행 시도 할 수 있습니다 :

    이 같은 쿼리를 구성하여 검색을 수행 시도 할 수 있습니다 :

    SELECT * FROM YourTable WHERE ID IN (Id1, Id2, ...., Idn)
    

    이 1000 IDS로 제한되어 있지만, 여기에 표시된이 작은 트릭을 사용하여 피할 수 있습니다.

  3. ==============================

    3.당신의 친절한 DBA는 당신이 거기에 파일을 풍덩 할 것이다, 당신이 사용하는 디렉토리를 매핑 한 테이블로 취급 할 수 있습니다. 그리고 기본적으로 당신은 파일과 같은 테이블에 가입 할 수 있습니다. EXTERNAL_TABLES에 대해 DBA에게 문의하십시오.

    당신의 친절한 DBA는 당신이 거기에 파일을 풍덩 할 것이다, 당신이 사용하는 디렉토리를 매핑 한 테이블로 취급 할 수 있습니다. 그리고 기본적으로 당신은 파일과 같은 테이블에 가입 할 수 있습니다. EXTERNAL_TABLES에 대해 DBA에게 문의하십시오.

  4. from https://stackoverflow.com/questions/34699223/how-to-load-a-large-number-of-strings-to-match-with-oracle-database by cc-by-sa and MIT license