복붙노트

[SQL] 저장 프로 시저 / 함수는 테이블을 반환 할 수 있나요?

SQL

저장 프로 시저 / 함수는 테이블을 반환 할 수 있나요?

MySQL의 저장 프로 시저 / 함수는 임시 테이블을 사용하지 않고 테이블을 반환 할 수 있습니까?

다음 절차를 만들기

CREATE PROCEDURE database.getExamples() 
    SELECT * FROM examples;

나중에 그것을 호출

CALL database.getExamples()

표시 예를 들어 테이블 - 그냥 예상 - 그러나 다음은 가능하지 않는 것 :

SELECT * FROM CALL database.getExamples()

방법 - 그것은 전혀 저장 프로 시저 / 함수에서 쿼리 결과 테이블을 반환하고, 그래서 만약 할 수 있습니까?

해결법

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

    1.지금,이 수 없습니다.

    지금,이 수 없습니다.

    다음은 FROM 절에 사용할 수 있습니다 무엇에 대한 설명서입니다 :

    table_references:
        table_reference [, table_reference] ...
    
    table_reference:
        table_factor
      | join_table
    
    table_factor:
        tbl_name [[AS] alias] [index_hint)]
      | table_subquery [AS] alias
      | ( table_references )
      | { OJ table_reference LEFT OUTER JOIN table_reference
            ON conditional_expr }
    
    join_table:
        table_reference [INNER | CROSS] JOIN table_factor [join_condition]
      | table_reference STRAIGHT_JOIN table_factor
      | table_reference STRAIGHT_JOIN table_factor ON conditional_expr
      | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition
      | table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor
    
    join_condition:
        ON conditional_expr
      | USING (column_list)
    
    index_hint:
        USE {INDEX|KEY} [FOR JOIN] (index_list)
      | IGNORE {INDEX|KEY} [FOR JOIN] (index_list)
      | FORCE {INDEX|KEY} [FOR JOIN] (index_list)
    
    index_list:
        index_name [, index_name] ...
    

    당신이 볼 수 있듯이, 저장 프로 시저는이 목록에 없습니다.

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

    2.저장 프로 시저 및 함수 : A.4 MySQL의 5.6 FAQ에 따르면 :

    저장 프로 시저 및 함수 : A.4 MySQL의 5.6 FAQ에 따르면 :

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

    3.그것은 그것을 할 수있는 것처럼 보이지만, 저장 프로 시저에서 출력 변수의 사용과. http://www.sqlinfo.net/mysql/mysql_stored_procedure_SELECT.php

    그것은 그것을 할 수있는 것처럼 보이지만, 저장 프로 시저에서 출력 변수의 사용과. http://www.sqlinfo.net/mysql/mysql_stored_procedure_SELECT.php

    -- 1. Create Procedure
    DROP PROCEDURE IF EXISTS `sp_students_SELECT_byPK` 
    GO
    
    CREATE PROCEDURE sp_students_SELECT_byPK
    (
        IN   p_student_id                    INT(11)       , 
        OUT  p_password                      VARCHAR(15)   , 
        OUT  p_active_flg                    TINYINT(4)    , 
        OUT  p_lastname                      VARCHAR(30)   , 
        OUT  p_firstname                     VARCHAR(20)   , 
        OUT  p_gender_code                   VARCHAR(1)    , 
        OUT  p_birth_dttm                    DATETIME      
     )
    BEGIN 
    
    SELECT password                      , 
           active_flg                    , 
           lastname                      , 
           firstname                     , 
           gender_code                   , 
           birth_dttm                    
    INTO   p_password                      , 
           p_active_flg                    , 
           p_lastname                      , 
           p_firstname                     , 
           p_gender_code                   , 
           p_birth_dttm                    
    FROM   students
    WHERE  student_id = p_student_id ; 
    
    END 
    
    GO
    
    -- 2. Select Results from Stored Procedure
    /***
    IN    p_student_id   INT(11)
    OUT   p_password     VARCHAR(15)
    OUT   p_active_flg   TINYINT(4)
    OUT   p_lastname     VARCHAR(30)
    OUT   p_firstname    VARCHAR(20)
    OUT   p_gender_code  VARCHAR(1)
    OUT   p_birth_dttm   DATETIME
    ***/
    
    CALL sp_students_SELECT_byPK
    (
      8, 
      @p_password , 
      @p_active_flg , 
      @p_lastname , 
      @p_firstname , 
      @p_gender_code , 
      @p_birth_dttm
    )
    GO
    
    SELECT @p_password      AS p_password      , 
       @p_active_flg    AS p_active_flg    , 
       @p_lastname      AS p_lastname      , 
       @p_firstname     AS p_firstname     , 
       @p_gender_code   AS p_gender_code   , 
       @p_birth_dttm    AS p_birth_dttm   
    GO
    
  4. ==============================

    4.당신은보기 대신 저장 프로 시저를 사용하여 당신이하려고하는 일을 할 수 있습니다,하지만 완전히 저장 프로 시저가 무엇을하는지에 따라 달라집니다.

    당신은보기 대신 저장 프로 시저를 사용하여 당신이하려고하는 일을 할 수 있습니다,하지만 완전히 저장 프로 시저가 무엇을하는지에 따라 달라집니다.

    임시 테이블을 사용하는 것이 유일한 옵션 인 경우, MEMORY 스토리지 엔진을 사용하는 것이 좋습니다.

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

    5.테이블에 삽입하지 않거나 변수가 결과 세트를 생성합니다 각 SELECT 문.

    테이블에 삽입하지 않거나 변수가 결과 세트를 생성합니다 각 SELECT 문.

    당신이 당신의 저장 프로 시저가 하나의 결과 집합을 반환 할 경우, 당신이 하나의 SELECT 문이 확인하십시오. 다른 SELECT 문이있는 경우, 그들은 그 테이블이나 변수에 결과를 삽입해야합니다.

    최신 정보 여기서 프로 시저의 예이다.

    이 저장 프로시 저는 하나 개의 결과 집합을 반환합니다 :

    DELIMITER ;;
    CREATE DEFINER=CURRENT_USER PROCEDURE stored_procedure_name()
    BEGIN
        DECLARE local_variable_name INT;
    
        SELECT column_name FROM table_1 LIMIT 1 INTO local_variable_name;
    
        SELECT * FROM table_1;
    END;;
    DELIMITER ;
    This stored procedure would return two result sets:
    
    DELIMITER ;;
    CREATE DEFINER=CURRENT_USER PROCEDURE stored_procedure_name()
    BEGIN
        DECLARE local_variable_name INT;
    
        SELECT column_name FROM table_1 LIMIT 1 INTO local_variable_name;
    
        SELECT * FROM table_1;
    
        SELECT * FROM table_2;
    END;;
    DELIMITER ;
    

    참고 : HTTPS : //dba.stackexchange.com/questions/8291/how-does-mysql-return-a-result-set-from-a-stored-procedure

  6. from https://stackoverflow.com/questions/1637288/can-a-stored-procedure-function-return-a-table by cc-by-sa and MIT license