IT

PL/pgSQL을 사용하여 쿼리 결과를 변수에 저장

itgroup 2023. 6. 2. 20:24
반응형

PL/pgSQL을 사용하여 쿼리 결과를 변수에 저장

PostgreSQL의 절차 언어인 PL/pgSQL의 변수에 쿼리 결과를 어떻게 할당합니까?

다음과 같은 기능이 기능은 다음과 같습니다.

CREATE OR REPLACE FUNCTION test(x numeric)
RETURNS character varying AS
$BODY$
DECLARE
name   character varying(255);
begin
 name ='SELECT name FROM test_table where id='||x;

 if(name='test')then
  --do somthing
 else
  --do the else part
 end if;
end;
return -- return my process result here
$BODY$
LANGUAGE plpgsql VOLATILE

위의 기능에서 나는 이 쿼리의 결과를 저장해야 합니다.

'SELECT name FROM test_table where id='||x;

변수에.name.

이것을 어떻게 처리합니까?

찾고 계신 것 같습니다.

select test_table.name into name from test_table where id = x;

그것은 그것을 당길 것입니다.name부터test_table어디에id함수의 인수이고 그것을 다음에 남깁니다.name변수.의 테이블 이름 접두사를 빠뜨리지 마십시오.test_table.name아니면 모호한 언급에 대한 불만을 듣게 될 것입니다.

단일 변수를 할당하려면 PL/pgSQL 코드 블록에서 오른쪽스칼라 하위 쿼리가 있는 일반 할당을 사용할 수도 있습니다.

name := (SELECT t.name from test_table t where t.id = x);

효과적으로 다음과 같습니다.SELECT INTO@mu가 이미 제공된 것처럼, 미묘한 차이가 있습니다.

  • SELECT INTOPostgres 14의 테스트에서 약간 더 빠릅니다.
    (관련되지 않은 상수의 일반적인 할당SELECT10배 더 빠릅니다.)
  • SELECT INTO또한 특수 변수를 설정하는 반면 일반 할당은 설정하지 않습니다.둘 중 하나를 원할 수도 있습니다.
  • SELECT INTO에서는 여러 변수를 동시에 할당할 수도 있습니다.참조:

특히 이 기능은 다음과 같습니다.

name := t.name from test_table t where t.id = x;

A SELECT주도권이 없는 진술SELECT하지만 저는 이 하이브리드를 사용하지 않을 입니다.@Pavel이 언급한 것처럼 처음 두 가지, 더 명확하고 문서화된 방법 중 하나를 사용하는 것이 좋습니다.

일반적인 패턴은EXISTS(subselect):

BEGIN
  IF EXISTS(SELECT name
              FROM test_table t
             WHERE t.id = x
               AND t.name = 'test')
  THEN
     ---
  ELSE
     ---
  END IF;

이 패턴은 PL/SQL, PL/pgSQL, SQL/PSM 등에 사용됩니다.

학습 테이블 만들기:

CREATE TABLE "public"."learning" (
    "api_id" int4 DEFAULT nextval('share_api_api_id_seq'::regclass) NOT NULL,
    "title" varchar(255) COLLATE "default"
);

데이터 학습 표 삽입:

INSERT INTO "public"."learning" VALUES ('1', 'Google AI-01');
INSERT INTO "public"."learning" VALUES ('2', 'Google AI-02');
INSERT INTO "public"."learning" VALUES ('3', 'Google AI-01');

단계: 01

CREATE OR REPLACE FUNCTION get_all (pattern VARCHAR) RETURNS TABLE (
        learn_id INT,
        learn_title VARCHAR
) AS $$
BEGIN
    RETURN QUERY SELECT
        api_id,
        title
    FROM
        learning
    WHERE
        title = pattern ;
END ; $$ LANGUAGE 'plpgsql';

단계: 02

SELECT * FROM get_all('Google AI-01');

단계: 03

DROP FUNCTION get_all();

데모: 여기에 이미지 설명 입력

단일 행 결과를 사용한 쿼리 실행에 따라 다음 구문을 사용합니다.

SELECT select_expressions INTO [STRICT] target FROM ...

어디에target레코드 변수, 행 변수 또는 쉼표로 구분된 단순 변수 및 레코드/행 필드 목록일 수 있습니다.

과는 달리SELECT INTO,SELECT select_expressions INTO테이블을 만들지 않습니다.

예제에서는 단일 단순 변수가 있습니다.name따라서 선택 문은 다음과 같습니다.

SELECT test_table.name INTO name FROM test_table WHERE test_table.id = x;

여기서는 기능 사용의 중요한 부분을 생략하는 답변이 많으며, 인기를 감안할 때 기능 사용에 대한 전반적인 간략한 입문서를 찾는 답변이 많다고 생각합니다.

다음은 postgres(선언, 변수, 인수, 반환 값 및 실행 포함)에서 함수를 사용하는 예입니다.아래는 오른쪽 하단의 "블럽"에 있는 트윗을 "안녕하세요 세계"로 업데이트하는 과도하게 구운 방법입니다.

id(클라이언트) pub_id(텍스트) 트윗(텍스트)
1 abc 안녕 세계
2 디프 흐느적거리다
-- Optional drop if replace fails below.
drop function if exists sync_tweets(text, text);

create or replace function sync_tweets(
    src_pub_id text, -- function arguments
    dst_pub_id text
) returns setof tweets as -- i.e. rows. int, text work too
$$
declare
    src_id    int; -- temp function variables (not args)
    dest_id   int;
    src_tweet text;
begin
    -- query result into a temp variable
    src_id := (select id from tweets where pub_id = src_pub_id);

    -- query result into a temp variable (another way)
    select tweet into src_tweet from tweets where id = src_id;

    dest_id := (select id from tweets where pub_id = dst_pub_id);
    update tweets set tweet=src_tweet where id = dest_id;

    return query -- i.e. rows, return 0 with return int above works too
        select * from tweets where pub_id in (src_pub_id, dst_pub_id);
end
$$ language plpgsql; -- need the language to avoid ERROR 42P13

-- Run it!
select * from sync_tweets('abc', 'def');

/*
  Outputs
   __________________________________________________ 
  |  id (serial)  |  pub_id (text)  |  tweet (text)  |
  |---------------|-----------------|----------------|
  |  1            |  abc            |  hello world   |
  |  2            |  def            |  blurb         |
  --------------------------------------------------
*/

다음 예제를 사용하여 PL/pgSQL을 사용하여 쿼리 결과를 변수에 저장할 수 있습니다.

 select * into demo from maintenanceactivitytrack ; 
    raise notice'p_maintenanceid:%',demo;

언급URL : https://stackoverflow.com/questions/12328198/store-query-result-in-a-variable-using-in-pl-pgsql

반응형