각 필드에 저장되어있는 콘텐츠의 내용 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 차단 차단을 사용할 필요가 제거 될 콤마, 콤마 필요성을 추가 할 필요가있다.