프로 시저를 MySQL은, 데이터 변환의 데이터베이스에 저장된 열 열 타입의 데이터가, 데이터가 삽입 벌크

각 필드에 저장되어있는 콘텐츠의 내용 1. 테이블은, 하나 개의 레코드의 필드의 내용 만 포함하고 표 B COLUMN_ID 필드 이름, 각 레코드의 필드의 이름을 나타낸다.

A와 B는 결합 2. 테이블은 테이블 기억 라인 (A) 내로 복수의 레코드, 및 표 B 필드 이름에 COLUMN_ID.

3. 광고 데이터 테이블 A 및 B는 20 매 임시 테이블 형태로 삽입되는 임시 테이블에 삽입 하였다.

persion_id 함유량 unique_flag
1 작은 (123)
1 (22) (123)
1 남성 (123)
COLUMN_ID 내 table_id
이름 정보
나이 정보
정보
persion_id 이름 나이 unique_flag
1 작은 (22) 남성 (123)

데이터 테이블 정보를 얻는다.도 1,도.도 2. 제 3 항에있어서, 상기 요건의 형태로 수득.

해결 방법 :

ㄱ 가변 필드에 데이터베이스 테이블에 할당해야하고, 반복 연산 인서트 당 필드 수 등으로부터 변수를 정의 (1).

- 변수의 정의
    DECLARE INSERT SQL VARCHAR (10000)에 문자 SET의 UTF8;  
    DECLARE valueSql VARCHAR (40000)에 문자 SET의 UTF8]
    - 커서 사이클이 완료되었는지 여부를 판정하며 INT 기본 0는 DONE DECLARE는
    상기 INT에서 국기 DEFAULT 0 DECLARE을
    DECLARE의 patient_id1 VARCHAR (80) 캐릭터 다음 SET UTF8;
    VARCHAR column_id1 declare 이름 (4000)에 문자 SET UTF8 초기 상태 0;
    DECLARE의 콘텐츠 1 VARCHAR (4000)에 문자 SET의 UTF8;
    VARCHAR unique_flag2 DECLARE (40)에 문자 SET UTF8 초기 상태 1].
    VARCHAR unique_flag1 DECLARE (40)에 문자 SET의 UTF8;
    DECLARE J VARCHAR (40) DEFAULT 1 - 기록 변화 필드 수, 동적 삽입 값 변수 이름 및 값
    CNT VARCHAR가 (40) DEFAULT 0 선언 - 카운터 카운트 레코드의 개수가 추가 된

커서를 정의 2, A 및 B는 데이터를 획득하기에 접속되어 테이블을 처리 할 수있다.

DECLARE mycursor 커서 SELECT는 
        , a.patient_id
        b.table_id,
        b.column_id,
        a.content,
        a.unique_flag을 
    qs_answer에서
    왼쪽 a.unique_key b.answer_id = ON ques_columns_master B JOIN  
    및 a.question_id = b.question_id WHERE B한다. 내 table_id = '건강'과 a.delete_flag = 0 
    a.unique_flag BY ORDER;
    DECLARE는 SET = 1 일을 찾을 수 없음 핸들러를 계속해서

3. 변수 초기화, insertSql 및 valueSql의 초기화

SET insertSql = CONCAT ( 'healthtmp (patient_id, unique_flag 내로 삽입')
SET valueSql = 'VALUES';

4. 커서, 각각의 판독 값을 처리 커서 및 insertSql valueSql에 전달되는 값 및 매 20 카운트와 접합 insertSql valueSql 문 실행한다 SQL 문에.

- 오픈 커서
    열림 MyCursor;
    param_loop : 루프    
        페치 MyCursor INTO의 patient_id1, table_id1, column_id1, 콘텐츠 1, unique_flag1]
        . 다음 DONE = IF 1
            나가기 param_loop;
        끝은 IF]
    . 세트에서 플래그 = 1;
    상기 CNT는 <= 20 THEN 경우
                는 IF THEN unique_flag2 = unique_flag1 // 다른 unique_flag에 레코드를 삽입
                        J <12 THEN // 모든 레코드 라인 메모리에 저장 기둥의 필드 (12)가있는 경우에 필요한
                            (insertSql, column_id1 SET insertSql = CONCAT을 '');
                        상기 END 된 IF는
                        은 IF 다음은 J = 12 
                            는 SET 삽입 SQL = CONCAT (삽입 SQL, column_id1 ')'); // 삽입 명령문 각각 20 SQL 삽입에 대해 하나의 삽입 영역이 필요
                        상기 중간 단부]
            는 IF THEN // 콘텐츠 1 콘텐츠 1이 비어있는 경우가 NULL 결과가 널이 필드 NULL 값으로 취급 할 수있는 데이터베이스의 요구에 저장된 CONCAT 연결된다
                                = ''는 SET의 콘텐츠 1을,
                        끝은 IF;
            는 IF MOD 12 THEN = 0 J이고 @ 12 컨텐츠 당 값은
                            상기 SET valueSql = CONCAT (valueSql '' '', 콘텐츠 1 '' '' ') ")
                        , 상기 단부 IF
             는 IF 후 J = MOD (12)는 0!
                            는 SET valueSql = CONCAT (valueSql '' '', 콘텐츠 1 '' '' '')
                        단부는 IF;
                            는 SET J = J + 1].
             단부는 IF;
                는 IF unique_flag2!= unique_flag1 THEN
                        SET CNT CNT = + 1;
                         다음 CNT = 21 인 IF
                            는 IF =에서 플래그 1 THEN. 
                                다음 SET = valueSql 문자열 (valueSql ,. 1 CHAR_LENGTH (valueSql) -1) 
                                SqlCmd1 = CONCAT (INSERT SQL, valueSql) @는 SET // 20 때 녹화 스티치 INSERT SQL valueSql, SqlCmd1을 수행, 데이터베이스에 결과를 삽입
                                (가) @ SqlCmd1 FROM stmt를 준 q,
                                STMT을 실행;
                                SET 삽입 SQL = CONCAT ( 'INSERT INTO의 healthtmp (patient_id, unique_flag,');
                                SET valueSql = CONCAT ( '값');
                            끝은 IF;
                                집합은 CNT . = 1;
                                는 SET J = 1.;
                        END IF;
                        IF J <12 THEN 
                                SET insertSql = CONCAT (insertSql, column_id1 '');    
                        END IF;
                        IF J = 12 THEN
                                SET insertSql = CONCAT (insertSql, column_id1 ')');    
                        END IF;
                        update_date1 후 NULL이면 
                                update_date1 SET = "";
                        END IF;
                        콘텐츠 1은 NULL 다음 IS 경우 
                                SET 콘텐츠 1 = "";
                        END IF;
                        SET valueSql = CONCAT (valueSql ' (' ''patient_id1 '' '' '', unique_flag1 '' '' '', 콘텐츠 1 '' ''); // 때 다른 필드의 초기 값 할당
                        . 다음 SET J = J + 1]
                        는 SET unique_flag2 = unique_flag1;
                끝은 IF;
         단부는 IF,
  단부 루프 param_loop]
   - 최후의 기록을 삽입 한 
    다음 SET = valueSql 문자열 (valueSql ,. 1 CHAR_LENGTH (valueSql)를 -1) 
        은 IF =에서 플래그 1. THEN 
            SqlCmd1 = CONCAT (INSERT SQL, valueSql) @는 SET,     
             (가) @ SqlCmd1 FROM stmt를 준 q는,
            하며 stmt를 EXECUTE
         끝은 IF를,
    닫기 MyCursor을;

    삽입의 마지막 값 요구가 마지막 값 valueSql 밖으로 추출 할 때, 각각의 값 후에 값 필드에 중국어 있기 때문에, 올바르게 CHAR_LENGTH 차단 차단을 사용할 필요가 제거 될 콤마, 콤마 필요성을 추가 할 필요가있다.

게시 36 개 원래 기사 · 원 찬양 19 ·은 30000 +를 볼

추천

출처blog.csdn.net/qq_27182767/article/details/84728455