2014-01-20 4 views
4

mysql 임시 테이블을 사용하여 여러 저장 프로 시저간에 중간 데이터를 공유합니다. 이 모든 절차는 단일 데이터베이스 연결을 사용합니다. 모든 SP에서 mysql 임시 테이블이 이미 있는지 여부를 확인해야합니다. 이미 존재한다면 그 값을 사용할 것입니다. 그렇지 않으면 SP는 & 임시 테이블 & 다른 SP를 작성합니다 (동일한 연결에서!) 임시 테이블 결과를 사용합니다.mysql 임시 테이블을 이해하는 방법은 이미 저장 프로 시저에 있습니까?

IF temporaryTablename EXISTS THEN 
    ... 
ELSE 
    ... 
END IF; 

어떤 생각 :

하지만 임시 테이블이 이미 존재하는 경우 내가 확인하는 방법을 모르거나하지, 나는 이런 식으로 뭔가를 의미?

+0

테이블에서 DESCRIBE를 시도하고 리턴 된 sqlcode를 확인하려고합니다 (저장된 proc에서 수행 할 수 있다고 생각합니다). 테이블 작성 여부에 따라 다른 sqlcode를 가져올 지 여부를 create/if가 없는지 확실하지 않습니다. – Kickstart

답변

4

테이블을 만들 때 IF NOT EXISTS (13.1.17. CREATE TABLE Syntax) 옵션이있는 경우이 경우 사용할 수 있습니다.

예 :

DELIMITER $$ 

CREATE PROCEDURE `temp_sp1`() 
BEGIN 
    CREATE TEMPORARY TABLE IF NOT EXISTS `temp_table` (
     `col2` int(11) DEFAULT NULL, 
     `col3` int(11) DEFAULT NULL 
    ); 
    INSERT INTO `temp_table` (`col2`, `col3`) VALUES (4, 5); 
    SELECT `col2`, `col3` FROM `temp_table`; 
END$$ 

DELIMITER ; 

SQL Fiddle demo

UPDATE

... 
DECLARE `no_such_table` TINYINT(1) DEFAULT 0; 
DECLARE CONTINUE HANDLER FOR SQLSTATE VALUE '42S02' SET `no_such_table` := 1; 
DO (SELECT NULL FROM `temp_table` LIMIT 0); 
IF (`no_such_table`) THEN 
    ... 
ELSE 
    ... 
END IF; 
... 
+0

이것은 내 대답의 질문이 아니며, 테이블이 이미 존재하지 않는 경우에만 값을 삽입하려고합니다. 그러나 여기에서는 어떤 방법으로도 확인하지 않습니다. –

+0

@EhsanKhodarahmi : 질문을 분명히 이해하지 못했습니다. 업데이트가 도움이되기를 바랍니다. – wchiquito

2
나를 위해 작동하지 않는 몇 가지 이유 wchiquito의 업데이트를

, 그래서이로 수정 :

그런 다음
CREATE PROCEDURE check_table_existence (IN table_name CHAR(64)) 
BEGIN 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @err = 1; 
    SET @err = 0; 
    SET @table_name = table_name; 
    SET @sql_query = CONCAT('SELECT NULL FROM ',@table_name); 
    PREPARE stmt1 FROM @sql_query; 
    IF (@err = 1) THEN 
     SET @table_exists = 0; 
    ELSE 
     SET @table_exists = 1; 
     DEALLOCATE PREPARE stmt1; 
    END IF; 
END 

는 :

CALL check_table_existence('existent_table'); 
SELECT @table_exists; 

그렇지 않으면

+---------------+ 
| @table_exists | 
+---------------+ 
|    1 | 
+---------------+ 

0 제공합니다.

해결 방법이지만 문제가되지 않습니다. TEMPORARY TABLE에서도 작동합니다.