[database] 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 INTO:

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

즉,을 끌어 name에서 test_table어디 id함수의 주장이며, 그것을두고 name변수입니다. 테이블 이름 접두사를 그대로 두지 않으면 test_table.name모호한 참조에 대한 불만이 표시됩니다.


답변

단일 변수를 할당하는 한 plpgsql 함수에서 일반 할당을 사용할 수도 있습니다.

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

또는 이미 제공된 @muSELECT INTO 와 같이 사용하십시오 .

이것도 작동합니다.

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

그러나 @Pavel이 언급했듯이 처음 두 가지 더 명확한 방법 중 하나를 사용하는 것이 좋습니다.

테이블 별칭으로 구문을 추가로 단축했습니다.
업데이트 : 코드 예제를 제거 하고 @Pavel에서 제공하는IF EXISTS() 것과 같이 대신 사용 하는 것이 좋습니다 .


답변

일반적인 패턴은 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();

데모:
여기에 이미지 설명을 입력하십시오


답변

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

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


답변