programing

저장된 프로시저/기능이 테이블을 반환할 수 있습니까?

yellowcard 2023. 10. 22. 19:59
반응형

저장된 프로시저/기능이 테이블을 반환할 수 있습니까?

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

다음 프로시저 만들기

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

그리고 나중에 다시 전화해요.

CALL database.getExamples()

는 예상대로 예제 테이블을 표시하지만 다음은 불가능한 것 같습니다.

SELECT * FROM CALL database.getExamples()

저장된 프로시저/함수에서 쿼리 결과 테이블을 반환하는 것이 가능한지, 가능하다면 - 어떻게?

지금으로서는 불가능합니다.

여기에 사용될 수 있는 것에 대한 문서가 있습니다.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] ...

보시다시피 저장 프로시저는 이 목록에 없습니다.

A.4 MySQL 5.6 FAQ: 저장 프로시저기능:

A.4.14: MySQL 5.6 저장 루틴이 결과 집합을 반환할 수 있습니까?

저장 프로시저는 가능하지만 저장된 함수는 가능하지 않습니다.

할 수 있을 것 같지만 저장된 절차의 출력 변수를 사용합니다.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

테이블이나 변수에 삽입되지 않는 각 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

저장 프로시저가 아닌 뷰를 사용하여 시도 중인 작업을 수행할 수도 있지만, 이는 저장 프로시저의 작업 방식에 전적으로 달려 있습니다.

임시 테이블을 사용하는 것이 유일한 옵션인 경우 메모리 저장 엔진을 사용하는 것을 고려합니다.

언급URL : https://stackoverflow.com/questions/1637288/can-a-stored-procedure-function-return-a-table

반응형