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
'programing' 카테고리의 다른 글
MariaDB는 열을 고유하게 만들지 않습니다. (0) | 2022.10.14 |
---|---|
바이트를 이진 문자열 표현으로 변환하는 방법 (0) | 2022.10.14 |
연산자 우선 순위(비트 '&'가 '=='보다 낮음) (0) | 2022.10.14 |
wamp server 컨피규레이션파일에 행 561 의 구문 에러가 포함되어 있습니다.파라미터 서비스는 알 수 없는 서비스를 지정합니다. (0) | 2022.10.14 |
표시되는 모든 마커를 포함하도록 지도 확대/축소 설정 (0) | 2022.10.14 |