질문)
1번 예시)

foreach (KeyValuePair<string, apmmultipleredismanager> redis in _redises)</string, apmmultipleredismanager>
{
    query = "insert all ";
    query = makeInsertString(query, redis.Value.Symbol);
    query += " SELECT * FROM DUAL";
    redis.Value.SendExeQuery(currentHandle, 2, 7, MetaData.APP_TYPE.QUERY.ToString(), query);
}



2번 예시)

query = "insert all ";
foreach (KeyValuePair<string, apmmultipleredismanager> redis in _redises)</string, apmmultipleredismanager>
{
    query = makeInsertString(query, redis.Value.Symbol);
}
query += " SELECT * FROM DUAL";    
redis.Value.SendExeQuery(currentHandle, 2, 7, MetaData.APP_TYPE.QUERY.ToString(), query);




답변)

INSERT ALL 구문을 사용할 때 중요한 것은 INSERT ALL과 INTO 절의 위치입니다. 두 가지 예시를 비교하며 올바른 구문을 설명하겠습니다.


💡 1번 예시 분석

foreach (KeyValuePair<string, APMMultipleRedisManager> redis in _redises) { query = "insert all "; query = makeInsertString(query, redis.Value.Symbol); query += " SELECT * FROM DUAL"; redis.Value.SendExeQuery(currentHandle, 2, 7, MetaData.APP_TYPE.QUERY.ToString(), query); }

🚫 문제점

  • 문법 오류: INSERT ALL 다음에 바로 SELECT가 오면 안 됩니다.
  • 반복 문제: foreach 루프 안에서 INSERT ALL을 시작하고 바로 SELECT * FROM DUAL을 붙이면, 하나의 INSERT ALL 구문에 여러 행을 넣지 못합니다.
  • 비효율: 루프마다 매번 단일 INSERT를 실행하는 형태가 됩니다.

💡 2번 예시 분석

query = "insert all "; foreach (KeyValuePair<string, APMMultipleRedisManager> redis in _redises) { query = makeInsertString(query, redis.Value.Symbol); } query += " SELECT * FROM DUAL"; redis.Value.SendExeQuery(currentHandle, 2, 7, MetaData.APP_TYPE.QUERY.ToString(), query);

✅ 올바른 구조

  • 루프 안에서 makeInsertString으로 여러 INTO 절을 만들고, 루프가 끝난 후에 SELECT * FROM DUAL을 붙입니다.
  • 하나의 INSERT ALL 구문으로 여러 행을 한꺼번에 삽입할 수 있습니다.

💡 결론: 2번 예시가 맞습니다!

👉 올바른 SQL 예시 (예상 형태)

루프가 완료된 후의 쿼리는 다음과 같은 형태가 됩니다:

INSERT ALL
INTO my_table (col1, col2) VALUES ('A', 1)
INTO my_table (col1, col2) VALUES ('B', 2)
INTO my_table (col1, col2) VALUES ('C', 3)
SELECT * FROM DUAL;
  • 이 구조라면 한 번의 실행으로 여러 행을 삽입할 수 있습니다.
  • INSERT ALL 구문은 하나의 트랜잭션으로 처리되므로 성능상 유리합니다.

2번 구조로 작성하는 것이 성능과 문법 면에서 적절합니다.
혹시 makeInsertString 함수의 내부 구조도 확인이 필요하다면 알려주세요!

+ Recent posts