sourcecode

ansysql INSERT INTO 생성

codebag 2023. 7. 12. 23:45
반응형

ansysql INSERT INTO 생성

10개의 테이블이 있는 Oracle 데이터베이스가 있습니다.일부 테이블에는 CLOB 데이터 텍스트가 있습니다.저는 자바를 사용하여 이 테이블에서 데이터를 프로그래밍 방식으로 내보내야 합니다.내보내기 데이터는 다음과 같은 ANSI INSERT INTO SQL 형식이어야 합니다.

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);

주요 아이디어는 이 데이터를 Oracle, MSSQLMySQL의 세 가지 데이터베이스로 가져와야 한다는 것입니다.이 모든 데이터베이스는 ANSI INSERT INTO를 지원하는 것으로 알고 있습니다.그러나 데이터 SQL 스크립트를 생성하기 위한 Java API/프레임워크를 찾을 수 없습니다.그리고 저는 CLOB 데이터를 어떻게 처리해야 할지, 어떻게 수출해야 할지 모릅니다.
자바를 사용하여 데이터베이스에서 데이터를 내보내는 가장 좋은 방법은 무엇입니까?

업데이트: (01.07.2018)
답변에 따르면 4000바이트 이상의 텍스트 데이터를 삽입하는 것은 불가능할 것 같습니다.자바를 프로그래밍 방식으로 사용하여 PL\SQL 스크립트를 생성하는 방법은 무엇입니까?아니면 ORACLE, MSSQL 등을 지원하는 다른 내보내기 포맷이 있습니까?

적절한 ORM-Api에 대해 생각해 본 적이 있습니까?제가 가장 먼저 생각하는 것은 Hibernate 또는 더 추상적인 JPA/JPQL입니다.프레임워크는 모든 주요 sql 방언을 알고 있습니다.여러분이 필요한 것은 여러분의 방언과의 연관성을 정의하는 것입니다.데이터베이스에서 데이터를 검색하고 POJO에 매핑된 데이터를 다른(다른 방언) 연결에 푸시(삽입)하는 것보다.잘 작동해야 한다고 생각합니다. 비록 제가 이것을 한 적이 없더라도요.하지만 JPA는 새로운 것이 아니며 소프트웨어가 이미 생산 중인 경우에도 데이터베이스를 변경하기 위해 널리 사용되는 것으로 알고 있습니다.이 접근 방식은 모든 행이 POJO로 변환되고 대량 삽입이 가능하지 않기 때문에 다소 성능이 떨어집니다.

SQL 생성을 원하는 경우 사용할 수 있는 많은 sqlbuilder 라이브러리가 있습니다.

메타데이터를 사용하여 select * 쿼리에서 열 이름과 유형을 가져와 삽입 쿼리에서 사용할 수 있습니다.

https://github.com/jkrasnay/sqlbuilder 을 참조하십시오.

자세한 내용은 http://john.krasnay.ca/2010/02/15/building-sql-in-java.html 을 참조하십시오.

Oracle 데이터베이스에서 테이블을 내보내고 다른 유형의 데이터베이스에 다시 삽입해야 할 경우 다른 방법을 제안합니다.

데이터베이스 구조를 나타내는 모델을 만들 수 있는 Java Persistence API(JPA)의 완벽한 사용 사례입니다.이것은 다양한 유형의 데이터베이스를 관리하기 위한 Java 현재 솔루션입니다.

모델에서 일반적인 모든 데이터베이스와 호환되는 요청을 생성할 수 있습니다.

따라서 Spring Boot + Spring Data + Spring Batch를 사용하는 것이 좋습니다.

  1. 모델에서 테이블의 내용을 CSV 형식으로 내보내는 첫 번째 앱을 만듭니다.
  2. CSV 파일을 가져오는 동일한 모델에서 두 번째 앱을 만듭니다.jdbc URL에 따라 Spring Boot은 대상 데이터베이스에 적합한 사투리를 자동으로 트리거하고 올바른 쿼리를 생성합니다(내보내기의 경우도 해당됨).

이 작업은 합리적인 시간 내에 적절한 성능으로 수행할 수 있습니다.

Java를 사용하여 이 테이블의 데이터를 프로그래밍 방식으로 내보내야 합니다.

어서, 친구야!무슨 일입니까?Java는 데이터를 운영하는 도구이지 마이그레이션하는 도구가 아닙니다.ETL에 관한 것이라면 - 대상 DBMS의 ETL 환경을 이용하거나 ETL 코드를 직접 작성해주시기 바랍니다.

MSSQL ORACLE의 경우 ANSI 표준에 대해 MERGE Tool 구문(및 데이터에 대한 USING 절)을 사용할 수 있습니다.

MERGE INTO tablename USING table_reference ON (condition)
   WHEN MATCHED THEN
   UPDATE SET column1 = value1 [, column2 = value2 ...]
   WHEN NOT MATCHED THEN
   INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...]);

MySQL의 경우 다음과 같은 구문이 있습니다(중복업데이트 문).

-- Insert new or merge into existing row.
MERGE INTO system_user target
USING (SELECT   1 AS system_user_id
       ,       'SYSADMIN' AS system_user_name
       ,        1 AS system_user_group_id
       ,        1 AS system_user_type
       ,       'Samuel' AS first_name
       ,        'the' AS middle_name
       ,       'Lamanite' AS last_name
       ,        1 AS created_by
       ,        SYSDATE AS creation_date
       ,        1 AS last_updated_by
       ,        SYSDATE AS last_update_date
       FROM     dual) SOURCE
ON (target.system_user_id = SOURCE.system_user_id)
WHEN MATCHED THEN
  UPDATE SET first_name = 'Samuel'
  ,          middle_name = 'the'
  ,          last_name = 'Lamanite'
  ,          last_updated_by = 1
  ,          last_update_date = SYSDATE
WHEN NOT MATCHED THEN
  INSERT
  ( target.system_user_id
  , target.system_user_name
  , target.system_user_group_id
  , target.system_user_type
  , target.first_name
  , target.middle_name
  , target.last_name
  , target.created_by
  , target.creation_date
  , target.last_updated_by
  , target.last_update_date )  
  VALUES
  ( SOURCE.system_user_id
  , SOURCE.system_user_name
  , SOURCE.system_user_group_id
  , SOURCE.system_user_type
  , SOURCE.first_name
  , SOURCE.middle_name
  , SOURCE.last_name
  , SOURCE.created_by
  , SOURCE.creation_date
  , SOURCE.last_updated_by
  , SOURCE.last_update_date );

그리고:

-- Insert new or merge into existing row.
INSERT INTO system_user
( system_user_name
, system_user_group_id
, system_user_type
, first_name
, middle_name
, last_name
, created_by
, creation_date
, last_updated_by
, last_update_date )
VALUES
('SYSADMIN'
, 1
, 1
,'Samuel'
,'the'
,'Lamanite'
, 1
, NOW()
, 1
, NOW())
ON DUPLICATE KEY 
UPDATE first_name = 'Samuel'
,      middle_name = 'the'
,      last_name = 'Lamanite'
,      last_updated_by = 1
,      last_update_date = UTC_DATE();

는 Scriptella를 먹어보겠습니다.Java로 작성된 오픈 소스 ETL 및 스크립트 실행 도구이며, 필요한 경우 xml 파일에서 소스 및 대상 연결 및 변환을 정의할 수 있습니다.JDBC 또는 텍스트 파일 및 배치 지원 기능에 대한 연결도 가능합니다.결과 xml 파일은 java, ant 또는 명령줄을 사용하여 프로그래밍 방식으로 처리할 수 있습니다.

2분간의 튜토리얼에는 테이블을 다른 데이터베이스로 복사하고 BLOB로 작업하는 예제가 있습니다.

저는 "프로그래머티컬하게"를 매우 좋아합니다. :)

은 테이블하고 "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 을 사용하여 입니다.insert into 이 거기에, 가 될 수 있습니다, 때문입니다.다른 RDBS가 약간 다른 방식으로 처리할 수 있기 때문에 바이너리 데이터가 있는 경우 문제가 될 수 있습니다.

blob/clob자바 쪽은 스트림을 읽는 것을 의미합니다.이진 또는 문자 스트림일 수 있습니다.Oracle의 경우 문서에서 다음 작업을 수행할 수 있습니다.

        ResultSet rs = s.executeQuery(
            "SELECT text FROM documents WHERE id = 1477");
        while (rs.next()) {
            java.sql.Clob aclob = rs.getClob(1);
            java.io.InputStream ip = rs.getAsciiStream(1);
            int c = ip.read();
            while (c > 0) {
                System.out.print((char)c);
                c = ip.read();
            }
            System.out.print("\n");
        }

이 답변을 통해 더 짧게 만들 수 있습니다.

Clob clob = resultSet.getClob("CLOB_COLUMN")
String clob_content = clob.getSubString(1, (int) clob.length());

출력을 작성하려면 다음을 처리해야 합니다.\t\n\r사용자의 요구사항, 컨텐츠에 따라 다릅니다.문서에는 읽기, 쓰기와 같은 완전한 예가 있습니다.그들은 준비된 문을 사용하기 때문에 양쪽 끝에 스트림이 필요합니다.만약 당신이clob32k/64k와 같이 크지 않습니다. 다른 제한이 있을 수 있습니다.예를 들어 - 예를 들면.create table2-3줄로 코드를 작성하고 작동하는 것을 제공하는 것이 누구나 훨씬 쉬울 것입니다.

언급URL : https://stackoverflow.com/questions/48112591/generate-ansi-sql-insert-into

반응형