2009-03-26 5 views
15

이것은 653714과 매우 유사하지만 SQL Server 대신 MySQL에서 사용합니다.MySQL [저장 프로 시저]에서 [temp 테이블]에 INSERT하는 방법

기본적으로 몇 가지 저장 프로 시저의 기초가되는 복잡한 선택이 있습니다. 저장 프로 시저간에 코드를 공유하고 싶습니다. 그러나 어떻게해야할지 모르겠습니다. 내가 할 수있는 한 가지 방법은 공유 선택 저장 프로 시저를 만들고 다른 저장 프로 시저에서 저장 프로 시저를 호출하는 것입니다. 중첩 된 저장 프로 시저의 결과 집합을 사용하여 작업하는 방법을 알 수 없습니다. 임시 테이블에 넣을 수 있다면 결과를 효과적으로 사용할 수 있지만 임시 테이블에서 가져 오는 방법을 알 수는 없습니다. 예를 들어,이 작동하지 않습니다 :

CREATE TEMPORARY TABLE tmp EXEC nested_sp(); 

답변

13

문제는 저장 프로 시저가 실제로 출력을 직접 반환하지 않는다는 것입니다. 스크립트 내에서 select 문을 실행할 수는 있지만 반환 값은 없습니다.

MySQL은 CALL StoredProcedureName();을 통해 저장 프로 시저를 호출합니다. 그리고 그 출력을 과 같이 출력 할 수 없습니다. 함수와 달리을 반환하지 않습니다.

MySQL Call Command

+0

인라인 하위 쿼리 – bobobobo

+14

을 사용해보세요.이 답변입니까? 해결책은 어디 있습니까? – Serge

+0

이렇게 할 수 없습니까? – Samra

5

내 첫 반응은 "그건 내게보기 같아."라고했습니다. 그만큼 추상화되지 않으므로 SP마다 가변성을 추가 할 수 있습니까?

그렇지 않은 경우 임시 테이블을 추가하는 것은 매우 가능성이있는 반 패턴입니다.

4

내가이 늦게 정말오고 알고 있지만, 실제 해결책을 찾기 위해 나에게 나이를했다 때문에 나뿐만 아니라 공유 할 수 있습니다. 나는 아래의 예를 연구했다. 생성

테이블은 다음과 같습니다


CREATE PROCEDURE BOOK_IMPORTANT(_PRICE DOUBLE, _B_ID INT, A_NAME CHAR(15), _BD_ID INT) 

BEGIN 

INSERT INTO BOOK(PRICE) 

VALUES(_PRICE); 

SET _B_ID=LAST_INSERT_ID(); 

INSERT INTO BOOK_COMMENT(B_ID) 

VALUES(_B_ID); 

SET _BD_ID=LAST_INSERT_ID(); 

INSERT INTO AUTHOR(A_NAME,B_ID) 

VALUES(A_NAME,_BD_ID); 

END 

는 다음 값을 삽입하려면 다음을 사용

CREATE TABLE BOOK(
B_ID INT NOT NULL AUTO_INCREMENT, 
PRIMARY KEY(B_ID), 
TITLE VARCHAR(100), 
DESCRIPTION VARCHAR(30), 
PRICE DOUBLE); 

CREATE TABLE BOOK_COMMENT(

PRIMARY KEY(B_C_ID), 
B_C_ID INT NOT NULL AUTO_INCREMENT, 
REMARK VARCHAR(120), 
B_ID INT, 
FOREIGN KEY(B_ID) REFERENCES BOOK(B_ID)); 

CREATE TABLE AUTHOR(
A_ID INT NOT NULL AUTO_INCREMENT, 
PRIMARY KEY(A_ID), 
A_NAME CHAR(15), 
B_ID INT, 

FOREIGN KEY(B_ID) REFERENCES BOOK(B_ID)); 
  1. DELIMITER.

    CALL BOOK_IMPORTANT('0.79',LAST_INSERT_ID(),'',LAST_INSERT_ID()); 
    

    LAST_INSERT_ID() 테이블의 마지막 자동 증가를 받아 자식 테이블의 참조 컬럼에 삽입합니다.

    프로 시저 매개 변수 _B_ID_BD_ID은 두 테이블에서 외래 키로 B_ID이 필요하므로 B_ID을 나타냅니다.

    과도한 표현은 유감입니다. 다른 모든 사람들은 당신이 자동으로 그것을하는 방법을 알기를 기대합니다. 희망 하시겠습니까?

3

저장 프로 시저로 "SELECT INTO"를 할 수 없습니다.

먼저 임시 테이블을 만들고 정상 "INSERT INTO"를 사용하여 쿼리 결과를 만든 임시 테이블에 저장하는 저장 프로 시저를 갖습니다. 임시 테이블은 테이블을 놓을 때 또는 연결이 닫힐 때까지 볼 수 있습니다.

관련 문제