programing

mysql에서 임시 테이블을 만드는 동안 문제가 발생했습니다.

coolbiz 2022. 10. 14. 22:03
반응형

mysql에서 임시 테이블을 만드는 동안 문제가 발생했습니다.

Mysql에서 특정 임시 테이블(있는 경우)을 삭제하고 데이터베이스 'prs1'에 이 임시 테이블을 만드는 저장 프로시저를 만들고 싶습니다.

작성한 절차는 다음과 같습니다.

    CREATE PROCEDURE `CrearTablaTemporal`(table_name VARCHAR(100))
BEGIN
    SET @TablaTemporal = table_name;
    SET @sql_query1 = CONCAT('DROP temporary table if exists ',@TablaTemporal);
    PREPARE stmt1 FROM @sql_query1;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;
    
    SET @sql_query2 = CONCAT('CREATE TEMPORARY TABLE IF NOT EXISTS prs1.',@TablaTemporal,' (ean13 VarChar(13)) Engine=MyISAM');
    PREPARE stmt2 FROM @sql_query2;
    EXECUTE stmt2;
    DEALLOCATE PREPARE stmt2;
END

저장 프로시저를 실행하면 오류가 나타나지 않지만 다음 SQL 문장을 실행하면 테이블이 존재하지 않음을 알 수 있습니다.

프로젝트(Xojo에서 작성)에서 스토어드 프로시저를 실행하면 에러는 발생하지 않지만 Navicat, Valentina Studio 등의 프로그램에서 데이터베이스를 확인해도 테이블이 존재하지 않기 때문에 완벽하게 작성되어 있는지 확인할 수 없습니다.문제는 어떻게 하면 테이블을 열어두고 값을 삽입하고 쿼리를 취득할 수 있는가 하는 것입니다.응용 프로그램을 닫을 때까지 항상 데이터베이스에 대한 연결이 열려 있다는 것을 설명합니다.내 방식으로는 트랜잭션을 시작하고 (저장된 프로시저 덕분에) 임시 테이블을 만드는 문장을 실행한 후 트랜잭션을 마칩니다.데이터베이스에 대한 연결을 닫지는 않지만 테이블을 유지하는 방법을 모릅니다.

제가 어떻게 풀 수 있을까요?

정말 감사합니다.세르지오

임시 테이블은 작성된 세션에서만 사용할 수 있습니다.연결이 종료되는 즉시 임시 테이블이 폐기됩니다.

임시 테이블을 사용하는 일반적인 사용 사례는 테스트 프레임워크입니다. 테스트 프레임워크에서는 임시 테이블을 사용하여 추가 정리를 방지할 수 있습니다.

세션 1:

mysql> delimiter !!
mysql> CREATE PROCEDURE CreateTable(table_name VARCHAR(100))
    -> BEGIN
    ->   SET @a:= CONCAT("CREATE OR REPLACE TEMPORARY TABLE ", table_name, " (a int)");
    ->   EXECUTE IMMEDIATE @a;
    -> END!!
Query OK, 0 rows affected (0,01 sec)

mysql> delimiter ;
mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
|            4118 |
+-----------------+
1 row in set (0,00 sec)

mysql> describe foobar;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| a     | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0,00 sec)

세션 2:

mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
|            4119 |
+-----------------+
1 row in set (0,01 sec)

mysql> describe foobar;
ERROR 1146 (42S02): Table 'test.foobar' doesn't exist

따라서 임시 테이블의 무결성 또는 내용을 확인해야 할 경우 동일한 연결 내에서 또는 임시 테이블이 아닌 테이블을 사용해야 합니다.

마침내 나에게 편지를 써준 모든 사람들의 도움으로 해결책을 찾았다.나는 Xojo로 프로그램하기 때문에 데이터베이스에 대한 조회가 이 프로그램에서 이루어집니다.Georg의 도움을 받아 임시 테이블은 해당 세션에만 존재하며, 이 테이블을 닫으면 임시 테이블이 삭제됩니다.이렇게 해서 나는 문제를 해결했다.

다음 단계로 메서드를 만들었습니다.

// 트랜잭션 시작

DB.SQLExecute("START TRANSACTION")

// 임시 테이블이 있으면 삭제하고 없으면 만듭니다.

다음 두 개의 SQL 문장을 사용해야 합니다.

'DROP temporary table if exists @TemporalTable'
'CREATE temporary table if NOT exists @TablaTemporal(field1 VarChar(13))

// OPTIONAL: 작성된 시간 테이블이 존재하는지 확인합니다(아래 참조).

// 임시 테이블에 값 삽입

Dim stmSQL As String 
DB.SQLExecute("START TRANSACTION")

stmSQL = "INSERT INTO @TablaTemporal(field1)"
stmSQL = stmSQL + " VALUES(?)"

Dim ps As MySQLPreparedStatement = DB.Prepare(stmSQL)
If BBDD.Error = True Then MsgBox DB.ErrorMessage
ps.BindType( 0, MySQLPreparedStatement.MYSQL_TYPE_STRING)
ps.Bind( 0, field1)
ps.SQLExecute

DB.Commit
Return Not DB.Error

//타임테이블에 대한 상담 결과를 복구합니다.

Dim stmSQL As String = "SELECT * FROM @Template"
Return DB.SQLSelect( stmSQL )

//임시 테이블을 드롭합니다.

DROP temporary table if exists 'Temporary Table

// 트랜잭션 완료

DB.CommitTransaction

임시 테이블이 있는지 확인하고 확인하기 위해 MySQL 데이터베이스에 다음 코드를 가진 "저장된 프로시저"를 만들었습니다.

CREATE PROCEDURE check_table_exists(table_name VARCHAR(100))
BEGIN
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @err = 1;
SET @err = 0;
SET @table_name = table_name;
SET @sql_query = CONCAT('SELECT 1 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

그러면 Xojo에서 다음 코드만 사용하여 프로시저를 호출하면 됩니다.

Dim stmSQL As String = "CALL check_table_exists('@TableTemporal')""
ExecuteSQL(stmSQL) database

다음 SQL 쿼리를 실행합니다.

Dim stmSQL As String = "SELECT @table_exists"
Return DB.SQLSelect(stmSQL)

결과가 '1'이면 테이블이 생성되어 존재하고, '0'이면 테이블이 존재하지 않습니다.

이게 누군가에게 도움이 됐으면 좋겠는데...저 같은 경우에는 순수하게 자기 학습을 위해서였거든요.

인사말이야, 세르지오

언급URL : https://stackoverflow.com/questions/63745303/problems-creating-a-temporary-table-in-mysql

반응형