postgreSQL에서 복합 유형의 변경 사항을 처리하는 방법

c# dapper postgresql psql sql

문제

postgresql을 배우려고하는데 문제가 발생했습니다. 저장 프로 시저 (함수)를 통해 웹 사이트에서 db 로의 연결을 대부분 갖고 싶습니다. 나는 지금까지 약 20 개의 함수를 가지고 있는데,이 함수 중 5 개가 열이있는 동일한 테이블을 정확하게 반환했다.

create or replace function my_Function( t text )
returns setof table(uid uuid,testText text, randomInt int ...)
...

table (uid uuid, testText text, randomInt int ...)이 5 회 반복되기 때문에 복합 함수를 사용하여 동일한 함수 유형의 데이터를 반환 할 수 있다고 생각 했으므로 여분의 열을 반환해야합니다. 내 복합 유형을 변경하고 voila를 변경하면 모든 5 개의 함수가 동일한 열을 반환해야합니다.

불행히도 그건 어떻게 작동하지 않는, 내 복합 유형에 새 열을 추가하자마자 내 복합 유형을 사용하는 모든 함수가 saem 오류로 고장났습니다.

Final statement returns too few columns

복합 형에 맞게 여분의 열을 선택하지 않기 때문에 의미가 있습니다.

어떤 함수가 반환 유형으로 복합 유형을 사용하는지 알 수있는 방법이 있습니까? 복합 유형을 새로 작성한 열에 대해 공백을 채우도록 강제로 지정할 수있는 방법이 있습니까 (그렇지 않은 경우 피할 수있는 중복성 문제를 해결할 수 없기 때문에 테이블 (...) 반환 유형을 사용할 수 있습니까?)

수락 된 답변

설치 예 :

create type my_type as (id int, name text);

create or replace function my_function_1()
returns setof my_type language plpgsql as $$
declare
    rec my_type;
begin
    rec.id := 1;
    rec.name := 'name';
    return next rec;
end $$;

create or replace function my_function_2()
returns setof my_type language plpgsql as $$
begin
    return query select 1::int, 'name'::text;
end $$;

어떤 함수가 반환 유형으로 복합 유형을 사용하는지 알 수있는 방법이 있습니까?

예:

select nspname as schema_name, proname as function_name
from pg_proc p
join pg_namespace n on n.oid = pronamespace
join pg_type t on t.oid = prorettype
where typname = 'my_type';

 schema_name | function_name 
-------------+---------------
 public      | my_function_1
 public      | my_function_2
(2 rows)

복합 유형이 새로 작성된 컬럼의 공 i을 채우게 할 수있는 f}이 있습니까?

아니요. 새 속성을 유형에 추가 한 후 함수를 수정하지 않고 다시 만들려고 할 수 있습니다.

alter type my_type add attribute new_col int;
create or replace function my_function_1() ...
create or replace function my_function_2() ...

그러나 유형의 다음 변수를 반환하는 함수 만 제대로 작동합니다 ( my_function_1() 은 작동하고 my_function_2() 는 작동하지 않습니다).


인기 답변

Postgres 복합 유형을 사용하면 어떤 이점이 있습니까? 그것은 고통의 세계처럼 보입니다. 이것이 QueryFirst에서 어떻게 작동하는지 탐색 할 수 있습니까? 귀하의 절차는 귀하의 응용 프로그램과 버전이, 귀하의 응용 프로그램에서 SQL 파일에 소스 제어됩니다. 반환 유형을 공유하는 5 개의 프로 시저의 경우 C # 인터페이스를 만듭니다. 5 개의 Results.cs 파일 각각에서 결과 partial 클래스에 대해 인터페이스를 상속합니다. 따라서 5 개의 procs는 필요에 따라 기둥을 추가하여 개별적으로 발전 할 수 있습니다. 만약 당신이 인터페이스를 더 이상 만족시키지 못하도록 proc을 수정했다면 : 컴파일 에러. 훨씬 관대하고 변화에 견딜 수있는 시나리오.

면책 조항 : QueryFirst



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.