전체보기: 525개의 글
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/cOJhp2/btq1XKVFkeo/QQBuUhaH8cIbgWKfPR5Zuk/img.png)
그동안 단일 건이나 간단한 IF문만 사용하여 프로시저를 생성했는데 MySQL에서도 Oracle의 Cursor같이 여러개의 데이터를 뽑아와 데이터를 반복하여 작업을 진행해보려한다. 1. TEST 테이블 생성하기 CREATE TABLE `TEST_TB1` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', `useYn` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', PRIMARY KEY (`id`) ) COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/csIsVE/btq1R8cUsBS/i5BX5PRMQ44gaOrkKvagak/img.png)
테이블 백업을 수행하는 프로시저를 생성해보려고 한다. 기존 테이블(직원, 휴가, 휴가기록)에서 백업 테이블을 새로 생성하는 프로시저를 만든다. 프로시저를 생성하고 이벤트 스케쥴(event schedule)까지 걸어보겠다. 1. MySQL 프로시저 생성하기 DELIMITER $$ DROP PROCEDURE IF EXISTS backup_proc; CREATE PROCEDURE backup_proc() BEGIN DROP TABLE IF EXISTS BACKUP_EMP; CREATE TABLE BACKUP_EMP SELECT * FROM EMP_EMPLOYEE; DROP TABLE IF EXISTS BACKUP_VAC; CREATE TABLE BACKUP_VAC SELECT * FROM VAC_VACATIO..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/kGDJx/btq1XKVFir3/eMJMJYN7xCNv4C2VW1MmPK/img.png)
쿼리에서 조건을 걸어 데이터가 return 0 row일때 쿼리에서 "값이 없다" 라는 결과를 리턴값으로 처리하는 방법을 사용해보려한다. 1. 테이블 생성하기 CREATE TABLE `CODE_TABLE` ( `CODE_CD` VARCHAR(10) NOT NULL COLLATE 'utf8_bin', `CODE_NM` VARCHAR(10) NOT NULL COLLATE 'utf8_bin' ) COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB; 코드테이블이라는 테스트 테이블을 생성한다. 코드테이블은 코드, 코드명 컬럼으로 구성된다. 2. 데이터 넣기 INSERT INTO CODE_TABLE VALUES('10','개발팀'); INSERT INTO CODE_TABLE VALUES('2..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/bCDVNi/btq1U8i8zvW/U5rxXXArwKwk9IvBfk4Wf1/img.png)
MySQL function을 이용해 직원 출석등록 함수를 만들어보겠다. 1. 테이블 생성하기 CREATE TABLE `EMP_ATTEND` ( `ATTEND_YMD` VARCHAR(8) NOT NULL COLLATE 'utf8_bin', `EMP_NO` VARCHAR(9) NOT NULL COLLATE 'utf8_bin' ) COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB; 간단하게 직원출석 테이블을 생성한다. 2. 함수 생성하기 DELIMITER $$ DROP FUNCTION IF EXISTS FNC_ATTEND; CREATE FUNCTION FNC_ATTEND(attendType VARCHAR(10), empNo VARCHAR(10)) RETURNS BOOL BEGIN D..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/bsXnHg/btq1Wg13aV1/7nGq8jMnlNHW6p6tBKCpOk/img.png)
Oracle에서는 CONNECT BY PRIOR, START WITH를 사용하여 자신의 ID와 연결된 부모 ID를 찾아가 계층적으로 쿼리결과를 뽑을 수 있다. 오라클에서만 제공하는 구문이다. -- UPMENU_ID에 연결된 MENU_ID가 계층적으로 표현된다. SELECT MENU_ID , UPMENU_ID FROM SYS_MENUINFO A CONNECT BY PRIOR MENU_ID = UPMENU_ID START WITH UPMENU_ID = '00000' 오라클 쿼리 결과 MySQL에서 위와 같은 계층형 쿼리로 구현하고자 한다면 Oracle에서 제공하는 구문을 사용할 수 없다. 아래는 테스트로 구현할 계층형 형태의 쿼리 결과이다. 동물 ┗말 ┗얼룩말 ┗조랑말 ┗망아지 ┗닭 ┗흰닭 ┗흰병아리 ┗흰달..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/bSWShi/btq1WhNrpJS/xF92sKvNuuaWmrR4rRampk/img.jpg)
1. SQL EXPLAIN 정리 1.1 부서 테이블 select * from dbadev.dept ; 부서테이블에는 4개의 행 ( 4rows returned ) 1.2 직원 테이블 select * from dbadev.emp ; 직원테이블에는 14개의 행 ( 14rows returned ) 1.3 부서와 직원 테이블을 내부조인 SELECT a.deptno , a.dname , a.loc , b.empno , b.ename , b.job FROM dbadev.dept as a INNER JOIN dbadev.emp as b ON a.deptno = b.deptno WHERE a.deptno= '20' ; 1.4 EXPLAIN을 사용한 부서테이블과 직원테이블 내부조인 쿼리 실행결과 EXPLAIN SELECT..
커서를 테이블에 연 다음 모든 레코드를 반복하는 저장 프로 시저를 작성하고 있습니다. 반복 프로세스에서 첫 번째 커서의 결과를 기반으로 동적 쿼리를 만듭니다. 동적 SQL에서 커서를 열어야하는데 mysql의 공식 문서에 따르면 MySQL "커서는 핸들러를 선언하기 전에 선언해야합니다. 변수와 조건은 먼저 선언해야합니다. 커서 또는 핸들러 선언 " . 다음은 스크립트입니다. DELIMITER $$ DROP PROCEDURE IF EXISTS sp_test$$ CREATE PROCEDURE `sp_test`() BEGIN -- Declarations DECLARE prepared_sql VARCHAR(1000); DECLARE index_count INT; -- Cursors DECLARE cursor1 C..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/bnyO0M/btq1V2iHtqw/7yRprAmS6Xy44gfzDMOpVk/img.png)
[COMMENT] 아직 프로시저에서 커서의 사용이 어떤 작업때 사용해야하는지 실무적으로 감이 없다. 대략적으로 이해한 것을 적어보면 select into 를 이용할 경우는 하나의 데이터만 변수값으로 가질 수 있으므로 select 한 결과를 한 로우씩 받아서 처리해야할 때 커서를 이용한다. 프로시저 예제. 커서(CURSOR) 이용하기 1. 프로시저 생성 DELIMITER // DROP PROCEDURE IF EXISTS EVT_MONITORING; CREATE PROCEDURE EVT_MONITORING() BEGIN DECLARE v_finished INTEGER DEFAULT 0; DECLARE v_evtname varchar(20); # select 한 컬럼을 담을 변수 선언 DECLARE v_evt..
[프로시저 내용] A테이블에(departments_dev) 접근하여 조회된 값을 커서에 담아서 B테이블(departments_dev2)에 입력하는 프로시저 0. 테스트용 생성 DDL (테스트용이라 간단하게 생성함) -- departments_dev 생성 (데이터 조회용 테이블) CREATE TABLE `departments_dev` ( `dept_no` CHAR(4) NOT NULL, `dept_name` VARCHAR(40) NOT NULL ) COLLATE='utf8_general_ci' ENGINE=InnoDB; insert into departments_dev values('d009','Customer Service'); insert into departments_dev values('d007',..
![](http://i1.daumcdn.net/thumb/C200x150/?fname=https://blog.kakaocdn.net/dn/xYyaC/btq1XhzsiBc/ZSUBOYKwTqeM4rEJ3kjSlk/img.png)
그동안 단일 건이나 간단한 IF문만 사용하여 프로시저를 생성했는데 MySQL에서도 Oracle의 Cursor같이 여러개의 데이터를 뽑아와 데이터를 반복하여 작업을 진행해보려한다. 1. TEST 테이블 생성하기 CREATE TABLE `TEST_TB1` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', `useYn` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci', PRIMARY KEY (`id`) ) COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB AUTO_INCREMENT=..