복붙노트

[SQL] FROM INSERT INTO [임시 테이블]에 MySQL을 어떻게 [저장 프로 시저]

SQL

FROM INSERT INTO [임시 테이블]에 MySQL을 어떻게 [저장 프로 시저]

이 MySQL을 대신 SQL Server에 대한하지만, 질문 653714 매우 유사하다.

기본적으로, 나는 몇 저장 프로 시저의 기초가있는 복잡한 선택을해야합니다. 나는 그러나, 나는이 작업을 수행하는 방법을 잘 모르겠어요, 저장 프로 시저를 통해 코드를 공유하고 싶습니다. 나는이 작업을 수행 할 수있는 한 가지 방법은 다른 사람에서 해당 저장 프로 시저를 호출 한 후 공유를 선택 저장 프로 시저를 만들고입니다. 나는 중첩 된 저장 프로 시저의 결과 세트로 작업하는 방법을 알아낼 수 없습니다. 나는 임시 테이블에 넣어 수 있다면 나는 효과적으로 결과를 사용할 수 있지만 나는 임시 테이블에 그들을 얻을하는 방법을 알아낼 수 없습니다. 예를 들어,이 작동하지 않습니다 :

CREATE TEMPORARY TABLE tmp EXEC nested_sp();

해결법

  1. ==============================

    1.문제는, 저장 프로 시저 정말 직접 출력을 반환하지 않습니다. 그들은 스크립트 내부 선택 문을 실행할 수 있지만 반환 값을 가질 수 없습니다.

    문제는, 저장 프로 시저 정말 직접 출력을 반환하지 않습니다. 그들은 스크립트 내부 선택 문을 실행할 수 있지만 반환 값을 가질 수 없습니다.

    MySQL은 CALL StoredProcedureName ()를 통해 저장 프로 시저를 호출; 그들이 (함수와 달리) 아무것도 반환하지 않는 한 그리고 당신은 아무것도에 그 출력을 할 수 없다.

    MySQL의 호출 명령

  2. ==============================

    2.내 첫 반응은 "나에게보기와 같은 그 소리"이었다. 추상적는 충분히 그래서 당신은 경우를 당 SP에 다양성을 추가 할 수 있습니다하지 않는?

    내 첫 반응은 "나에게보기와 같은 그 소리"이었다. 추상적는 충분히 그래서 당신은 경우를 당 SP에 다양성을 추가 할 수 있습니다하지 않는?

    그렇지 않으면 매우 가능성이 안티 패턴이되지 않을 것 임시 테이블을 추가 뭐든지.

  3. ==============================

    3.당신은 할 수 없습니다 저장 프로 시저 "SELECT INTO".

    당신은 할 수 없습니다 저장 프로 시저 "SELECT INTO".

    먼저 임시 테이블을 작성하고 정상 "INSERT INTO"를 사용하여 만든 임시 테이블에 쿼리 결과를 저장하기 위해 저장 프로 시저가 있습니다. 임시 테이블은 드롭 long로서 또는 연결이 닫힐 때까지 볼 수 있습니다.

  4. ==============================

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

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

    생성 된 테이블은 다음과 같습니다 :

    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));
    
    
    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
    

    다음 값을 삽입하려면 다음을 사용합니다.

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

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

    나는 두 테이블에서 외래 키로 B_ID을 필요로하기 때문에 프로 시저 매개 변수에서 _B_ID 및 _BD_ID는 B_ID을 나타냅니다.

    초과 문구 죄송합니다. 다른 모든 사람들은 당신이 자동으로 수행하는 방법을 알고 기대합니다. 희망이 도움이

  5. ==============================

    5.어쩌면 폐쇄 주제,하지만 MySQL의 임시 테이블의 속성을 기반으로 솔루션을 제공하고 싶습니다. 첫째, 임시 테이블을 만들 수있는 방법은 저장 프로 시저를 호출하지 않을 것 "TEMPORARY TABLE tmp를 EXEC의 nested_sp ()를 CREATE;". 쿼리는 "인프라"의 임시 테이블이며, (어떻게 든 이름을 지정합니다).

    어쩌면 폐쇄 주제,하지만 MySQL의 임시 테이블의 속성을 기반으로 솔루션을 제공하고 싶습니다. 첫째, 임시 테이블을 만들 수있는 방법은 저장 프로 시저를 호출하지 않을 것 "TEMPORARY TABLE tmp를 EXEC의 nested_sp ()를 CREATE;". 쿼리는 "인프라"의 임시 테이블이며, (어떻게 든 이름을 지정합니다).

    원하는 결과를 달성하기 위해, 2 프로 시저를 생성 할 필요가 있고, 첫 번째 저장된 절차는 데이터를 처리하고, 임시 "인프라 스트럭처"테이블 번째 저장 프로 시저를 채우고,이 테이블을 판독하고, 프로세스 마지막 "드롭"를 계속 "인프라"테이블

    이 첫 번째 저장 프로 시저입니다 :

        CREATE DEFINER = 'root'@'localhost'
    PROCEDURE cajareal.priv_test()
    BEGIN
      CREATE TEMPORARY TABLE IF NOT EXISTS  tmp(
          column1 TEXT
        , column2 TEXT
        , column3 TEXT
        );
    
    
    
      INSERT INTO tmp(column1, column2 , column3) VALUES(CURDATE(), CURRENT_DATE(), CURRENT_TIMESTAMP());
    
    END
    

    이것은 두 번째 저장 프로 시저입니다 :

    CREATE DEFINER = 'root'@'localhost'
    PROCEDURE cajareal.priv_caller()
    BEGIN
      CALL priv_test;
    
      -- Read data of "infrastructure" table
      SELECT * FROM tmp;
    
    
      -- Do the business logic
    
    
      -- Delete the "infrastructure" table
      DROP TABLE tmp;
    END
    

    나는 문자열을 분석하기 위해이 기술을 사용하여 테이블로 변환

  6. from https://stackoverflow.com/questions/687102/mysql-how-to-insert-into-temp-table-from-stored-procedure by cc-by-sa and MIT license