programing

MySQL에서 테이블 변수 만들기

goodjava 2023. 1. 4. 20:06

MySQL에서 테이블 변수 만들기

MySQL 프로시저 내의 테이블에서 특정 행을 저장할 테이블 변수가 필요합니다.예: declare @tb 테이블(id int,name varchar(200))

이게 가능합니까?만약 그렇다면 어떻게?

MySQL에는 존재하지 않죠?온도 테이블을 사용합니다.

CREATE PROCEDURE my_proc () BEGIN 

CREATE TEMPORARY TABLE TempTable (myid int, myfield varchar(100)); 
INSERT INTO TempTable SELECT tblid, tblfield FROM Table1; 

/* Do some more stuff .... */

여기 MySQL에서

"테이블을 작성할 때 TEMPOLY 키워드를 사용할 수 있습니다.TEMPORY 테이블은 현재 연결에만 표시되며 연결이 닫히면 자동으로 삭제됩니다.즉, 2개의 다른 접속이 서로 경합하지 않고 같은 이름의 기존 비 TEMPOLY 테이블과 같은 임시 테이블 이름을 사용할 수 있습니다.(기존 테이블은 임시 테이블이 폐기될 때까지 숨겨집니다.)"

아마 임시 테이블이 당신이 원하는 것을 할 수 있을 것이다.

CREATE TEMPORARY TABLE SalesSummary (
product_name VARCHAR(50) NOT NULL
, total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
, avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
, total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
) ENGINE=MEMORY;

INSERT INTO SalesSummary
(product_name, total_sales, avg_unit_price, total_units_sold)
SELECT 
  p.name
  , SUM(oi.sales_amount)
  , AVG(oi.unit_price)
  , SUM(oi.quantity_sold)
FROM OrderItems oi
INNER JOIN Products p
    ON oi.product_id = p.product_id
GROUP BY p.name;

/* Just output the table */
SELECT * FROM SalesSummary;

/* OK, get the highest selling product from the table */
SELECT product_name AS "Top Seller"
FROM SalesSummary
ORDER BY total_sales DESC
LIMIT 1;

/* Explicitly destroy the table */
DROP TABLE SalesSummary; 

forge.mysql.com 에서.문서의 임시 테이블 조각도 참조하십시오.

질문에 대한 답변: 아니요, MySQL은 SQL Server(http://msdn.microsoft.com/en-us/library/ms188927.aspx))와 같은 방식으로 테이블 형식의 변수를 지원하지 않습니다.Oracle은 유사한 기능을 제공하지만 테이블 유형이 아닌 커서 유형(http://docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems012.htm))이라고 합니다.

필요에 따라 Oracle 및 SQL Server에서 제공하는 것과 유사한 방법으로 임시 테이블을 사용하여 MySQL에서 테이블/커서 유형 변수를 시뮬레이션할 수 있습니다.

단, 임시 테이블접근법과 테이블/커서 타입의 변수접근법 사이에는 중요한 차이가 있으며 퍼포먼스에 많은 영향을 미칩니다(이 때문에 Oracle 및 SQL Server는 임시 테이블에서 제공되는 기능보다 이 기능을 더 많이 제공합니다).

구체적으로는, table/cursor 타입의 변수를 사용하면, 클라이언트는 클라이언트측의 복수의 데이터 행을 조합해, 보존 프로시저 또는 준비된 스테이트먼트에의 입력으로서 서버에 송신할 수 있습니다.이것에 의해, 각 행의 송신에 드는 오버헤드가 없어져, 대신에 행의 배치에 대해서 그 오버헤드를 1회 지불합니다.이는 대량의 데이터를 Import하려고 할 때 전체적인 성능에 큰 영향을 미칠 수 있습니다.

생각할 수 있는 회피책:

임시 테이블을 작성한 후 LOAD DATA(http://dev.mysql.com/doc/refman/5.1/en/load-data.html) 명령을 사용하여 데이터를 임시 테이블로 스트리밍하는 것이 좋습니다.그런 다음 임시 테이블의 이름을 저장 프로시저에 전달할 수 있습니다.이렇게 해도 데이터베이스 서버에 대한 콜은 2회 발생하지만 행을 충분히 이동하면 절약될 수 있습니다.물론 이것은 저장 프로시저 내에서 타깃테이블을 갱신할 때 논리적인 작업을 하고 있는 경우에만 도움이 됩니다.그렇지 않은 경우 데이터를 대상 테이블에 직접 로드할 수 있습니다.

MYSQL 8은 다음과 같은 기능을 합니다.

MYSQL 8은 JSON 테이블을 지원하므로 결과를 JSON 변수에 로드하고 JSON_TABLE() 명령을 사용하여 해당 변수에서 선택할 수 있습니다.

테이블을 데이터베이스에 저장하지 않으려면 @Evan Todd는 이미 임시 테이블 솔루션을 제공받았습니다.

그러나 다른 사용자를 위해 해당 테이블이 필요하고 db에 저장하려는 경우 다음 절차를 사용할 수 있습니다.

아래에 '저장된 프로시저'를 만듭니다.

————————————

DELIMITER $$

USE `test`$$

DROP PROCEDURE IF EXISTS `sp_variable_table`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_variable_table`()
BEGIN

SELECT CONCAT(‘zafar_’,REPLACE(TIME(NOW()),’:',’_')) INTO @tbl;

SET @str=CONCAT(“create table “,@tbl,” (pbirfnum BIGINT(20) NOT NULL DEFAULT ’0′, paymentModes TEXT ,paymentmodeDetails TEXT ,shippingCharges TEXT ,shippingDetails TEXT ,hypenedSkuCodes TEXT ,skuCodes TEXT ,itemDetails TEXT ,colorDesc TEXT ,size TEXT ,atmDesc TEXT ,promotional TEXT ,productSeqNumber VARCHAR(16) DEFAULT NULL,entity TEXT ,entityDetails TEXT ,kmtnmt TEXT ,rating BIGINT(1) DEFAULT NULL,discount DECIMAL(15,0) DEFAULT NULL,itemStockDetails VARCHAR(38) NOT NULL DEFAULT ”) ENGINE=INNODB DEFAULT CHARSET=utf8″);
PREPARE stmt FROM @str;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SELECT ‘Table has been created’;
END$$

DELIMITER ;

———————————————–

이제 이 절차를 수행하여 다음과 같이 변수 이름 테이블을 만들 수 있습니다.

sp_call_table()을 호출한다.

다음 명령을 실행한 후 새 테이블을 확인할 수 있습니다.

test를 사용합니다; show tables like '%zafar%'; — test는 여기에 'test' 이름이 있습니다.

자세한 내용은 아래 경로에서도 확인하실 수 있습니다.

http://mydbsolutions.in/how-can-create-a-table-with-variable-name/

언급URL : https://stackoverflow.com/questions/1524858/create-table-variable-in-mysql