>데이터 베이스 >MySQL 튜토리얼 >PL/pgSQL 함수가 어떻게 다양한 SELECT 쿼리의 결과를 동적으로 반환할 수 있습니까?

PL/pgSQL 함수가 어떻게 다양한 SELECT 쿼리의 결과를 동적으로 반환할 수 있습니까?

DDD
DDD원래의
2025-01-22 23:31:12555검색

How Can a PL/pgSQL Function Dynamically Return Results from Various SELECT Queries?

다양한 SELECT 쿼리의 출력을 반환하도록 PL/pgSQL 함수를 리팩터링

동적 SQL 및 반환 유형

정의되지 않은 유형의 레코드를 반환합니다

원래 함수에서는 반환 유형을 텍스트로 선언했지만 이제는 생성된 SQL 문을 실행하고 그 결과를 레코드로 반환하는 것이 목표입니다. 이렇게 하려면 동적 SQL을 사용하고 아직 정의되지 않은 유형의 반환 레코드를 처리해야 합니다.

숫자 및 데이터 유형 변경이 가능한 사용자 정의 유형

한 가지 접근 방식은 고정된 열 수와 가변 데이터 유형을 사용하여 사용자 정의 반환 유형을 만드는 것입니다. 그러나 이를 위해서는 각 호출에 대한 열 정의 목록을 정의해야 하며, 이는 열 이름과 데이터 유형을 미리 알 수 없으면 실용적이지 않습니다.

다형성 유형 사용

pg_typeof() 테이블 이름을 객체 식별자 유형(regtype)으로 반환합니다. 자동으로 텍스트로 변환되면 식별자가 자동으로 큰따옴표로 묶이고 패턴 한정되어 SQL 삽입을 방지합니다.

반환 쿼리 실행

동적 SQL을 실행하고 행을 반환하는 데 선호되는 방법은 RETURN QUERY EXECUTE입니다. 이를 통해 SQL 쿼리를 실행하고 결과를 잘 정의된 행 유형의 행 집합으로 반환할 수 있습니다.

코드 예시

테이블 유형 매개변수를 기반으로 모든 테이블의 모든 열을 반환한다고 가정해 보겠습니다.

<code class="language-sql">CREATE OR REPLACE FUNCTION data_of(_tbl_type anyelement, _id int)
  RETURNS SETOF anyelement
  LANGUAGE plpgsql AS
$func$
BEGIN
   RETURN QUERY EXECUTE format('
      SELECT *
      FROM   %s  -- 自动用双引号括起来并进行模式限定
      WHERE  id = 
      ORDER  BY datahora'
    , pg_typeof(_tbl_type))
   USING  _id;
END
$func$;</code>

사용방법

테이블 유형을 첫 번째 매개변수로, ID를 두 번째 매개변수로 사용하여 이 함수를 호출하세요. 이 함수는 지정된 테이블에서 지정된 ID를 가진 레코드의 모든 열을 반환합니다.

<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17);
-- 将pcdmet替换为任何其他表名。</code>

위 내용은 PL/pgSQL 함수가 어떻게 다양한 SELECT 쿼리의 결과를 동적으로 반환할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.