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 INTO
Postgres 14의 테스트에서 약간 더 빠릅니다.
(관련되지 않은 상수의 일반적인 할당SELECT
10배 더 빠릅니다.)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
'IT' 카테고리의 다른 글
vuex 상태에서 메타 테마 색상 변경 (0) | 2023.06.07 |
---|---|
Swift perform Selector:withObject:afterDelay:는 사용할 수 없습니다. (0) | 2023.06.02 |
루비의 대장 연산자는 무엇입니까? (0) | 2023.06.02 |
반복하는 동안 값 변경 (0) | 2023.06.02 |
배열에 다른 배열의 값이 포함되어 있습니까? (0) | 2023.06.02 |