> 데이터 베이스 > MySQL 튜토리얼 > 동적 SQL 반환 유형을 처리하기 위해 PL/pgSQL 함수를 리팩터링하는 방법은 무엇입니까?

동적 SQL 반환 유형을 처리하기 위해 PL/pgSQL 함수를 리팩터링하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2025-01-22 23:32:11
원래의
148명이 탐색했습니다.

How to Refactor a PL/pgSQL Function to Handle Dynamic SQL Return Types?

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

동적 SQL 및 반환 유형

현재 함수는 생성된 SELECT 문을 나타내는 텍스트 문자열을 반환합니다. 실행을 자동화하고 결과를 반환하려면 동적 SQL을 사용할 수 있습니다. 그러나 정의되지 않은 반환 유형에 어려움이 있습니다. 함수는 RETURNS 절에 반환 유형을 정의해야 합니다.

고정반환형 솔루션

datahora이라는 타임스탬프 열과 다른 이름과 유형을 가진 두 개의 추가 열을 포함하는 고정 반환 유형을 가정하면 다음을 구현할 수 있습니다.

<code class="language-sql">CREATE OR REPLACE FUNCTION data_of(_id integer)
  RETURNS TABLE (datahora timestamp, col2 text, col3 text)
  LANGUAGE plpgsql AS
$func$
DECLARE
   _sensors text := 'col1::text, col2::text';  -- 将每一列强制转换为文本类型
   _type    text := 'foo';
BEGIN
   RETURN QUERY EXECUTE '
      SELECT datahora, ' || _sensors || '
      FROM   ' || quote_ident(_type) || '
      WHERE  id = 
      ORDER  BY datahora'
   USING  _id;
END
$func$;</code>
로그인 후 복사

컬럼 개수는 가변적이지만 유형은 동일합니다

반환 유형에 가변 개수의 열이 있지만 모든 열이 동일한 유형(예: double)인 경우 배열 유형을 사용합니다.

<code class="language-sql">CREATE OR REPLACE FUNCTION data_of(_id integer)
  RETURNS TABLE (datahora timestamp, names text[], values float8[])
  LANGUAGE plpgsql AS
$func$
DECLARE
   _sensors text := 'col1, col2, col3';  -- 列名的简单列表
   _type    text := 'foo';
BEGIN
   RETURN QUERY EXECUTE format('
      SELECT datahora
           , string_to_array()  -- 作为名称
           , ARRAY[%s]            -- 作为值
      FROM   %s
      WHERE  id = 
      ORDER  BY datahora'
    , _sensors, _type)
   USING  _sensors, _id;
END
$func$;</code>
로그인 후 복사

완전한 테이블형

테이블의 모든 열을 반환하려면 다형성 유형을 사용하세요.

<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  -- pg_typeof 返回 regtype,自动引用
      WHERE  id = 
      ORDER  BY datahora'
    , pg_typeof(_tbl_type))
   USING  _id;
END
$func$;</code>
로그인 후 복사

사용방법:

<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17);</code>
로그인 후 복사

위 내용은 동적 SQL 반환 유형을 처리하기 위해 PL/pgSQL 함수를 리팩터링하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿