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


130

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.

이것을 처리하는 방법?

답변:


198

나는 당신이 찾고 있다고 생각합니다 SELECT INTO:

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

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


2
여러 변수가 필요한 경우 어떻게합니까? select test_table.name, test_table.id, test_table.ssn과 같이?
Dao Lam

2
@DaoLam : 내가 좋아하는 문서에서 : "단일 행을 생성하는 SQL 명령의 결과 (여러 열일 수 있음)를 레코드 변수, 행 유형 변수 또는 스칼라 변수 목록에 지정할 수 있습니다."
mu는

@ muistooshort 그래서 당신은 내가 똑같이 할 수 있고 name.id, name.ssn을 사용하여 검색 할 수 있다고 말하고 있습니까? 나는 IF EXISTS로 시도했지만 작동하지 않았다 : IF EXISTS (select_table에서 name으로 *를 선택하십시오 ...))
Dao Lam

@DaoLam 왜 INTO와 IF EXISTS를 결합합니까? 하려는 일을 설명 할 수 있도록 새로운 질문을해야 할 수도 있습니다.
mu는

3
문서에는 예제가 없습니다 (또는 놓쳤습니다). @muistooshort가 지적했듯이 단일 선택으로 여러 변수를 선택할 수 있습니다.SELECT test_table.column1, test_table.column2 INTO variable1, variable2 FROM test_table WHERE id = x;
Grengas

78

단일 변수를 할당하는 한 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() 것과 같이 대신 사용 하는 것이 좋습니다 .


1
이것은 좋은 생각이 아니다 -이 기능은 문서화되지 않고 못생긴
파벨 Stehule

2
PL / pgSQL을 사용하면 SQL과 PL을 혼합 할 수 있으며 때로는 이상한 생물을 만들 수도 있지만 고립 된 문장에서 PL과 SQL을 깔끔하게 혼합하는 것이 좋습니다.
Pavel Stehule

@PavelStehule : 본인의 양식이 바람직합니다.
Erwin Brandstetter

실제로 나는 당신의 구문을 선호하지만 문제는 처리 오류를 처리하고 싶을 때, 당신의 문장은 select into 문장의 반대쪽에 체크 아웃 ( postgresql.org/docs/9.1/plpgsql-statements.html )
SENHAJI RHAZI Hamza

18

일반적인 패턴은 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, ...에서 사용됩니다.


2

학습 테이블 생성 :

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();

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


-2

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

 select * into demo from maintenanceactivitytrack ; 
    raise notice'p_maintenanceid:%',demo;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.