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;