database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 9567 게시물 읽기
No. 9567
PG_GETARG_INT32 관련..
작성자
초보DBA(r00tlee)
작성일
2015-07-08 13:42
조회수
9,120

 PG_GETARG_INT32 관련해서

PG_GETARG_INT32(1) 과

PG_GETARG_INT32(2)는 무슨 차이점이 있나요?

 

즉, 저기 인자값은 무슨 의미를 부여하는지 도움좀 주세요..

이 글에 대한 댓글이 총 5건 있습니다.

-- PG_GETARG_INT32 관련해서

-- PG_GETARG_INT32(1) 과

-- PG_GETARG_INT32(2)는 무슨 차이점이 있나요?

 

혹시, C/C++ 은 얼마나 알고 있나요?

초보대왕님이 2015-07-08 16:01에 작성한 댓글입니다. Edit

 ex) select add_one(4,2);

add_one

-------------------------------

2

(1 row)

/////////////////

#include "postgres.h"

 

#include <string.h>

#include "fmgr.h"

 

PG_MODULE_MAGIC;

 

PG_FUNCTION_INFO_V1(add_one);

 

Datum

add_one(PG_FUNCTION_ARGS)

{

int arg1 = PG_GETARG_INT32(0);

int arg2 = PG_GETARG_INT32(1);

 

PG_RETURN_INT32(arg1 + arg2);

}

 

왜 인자값을 정상적으로 받지 못하는지 궁금하네요..

 

초보DBA(r00tlee)님이 2015-07-08 16:11에 작성한 댓글입니다.

ex) select add_one(4,2);

add_one

-------------------------------

2

(1 row)

 

/////////////////

 

#include "postgres.h"

#include

#include "fmgr.h"

 

 PG_MODULE_MAGIC;

 

PG_FUNCTION_INFO_V1(add_one);

 

Datum

add_one(PG_FUNCTION_ARGS)

{

int arg1 = PG_GETARG_INT32(0);

int arg2 = PG_GETARG_INT32(1);

 

PG_RETURN_INT32(arg1 + arg2);

}

 

 

 

왜 인자값을 정상적으로 받지 못하는지 궁금하네요..

 

음, PG_RETURN_INT32(arg1 + arg2) 직전에 arg1 과 arg2 과 arg1+arg2 의 로그를 한 번 찍어 보세요.

초보대왕님이 2015-07-09 01:17에 작성한 댓글입니다.
이 댓글은 2015-07-09 02:30에 마지막으로 수정되었습니다. Edit

 찍어 보았으나 정상적으로 받질 못합니다.. 결국 1버전 포기하고 0버전으로 할려고요 감사합니다. :)

초보DBA(r00tlee)님이 2015-07-09 09:27에 작성한 댓글입니다.

  C 조금만 하면 충분히 C 함수를 만들 수 있습니다. 

 

코딩 보다 그 모듈을 빌드하고, DB내 함수로 지정하는 일이 낯설 뿐입니다. 

 

윗 코드에서 조심하셔야 하는 부분은 

int arg1 = PG_GETARG_INT32(n);

부분에서 return 값의 자료형을 int 에서 int32 로 pg 내부 자체 선언한 자료형으로 지정하는 것이 안전합니다. 

그 외에 별로 할 말이 없습니다. (물론 x86 환경에서는 int나 int32나 차이는 없겠지만)

저 함수의 매개변수로 오는 숫자는 첫번째 인자를 0으로 그 다음 인자를 1... 이렇게 쭉.

 

PostgreSQL 확장 C 모듈은 pgxs 기능을 이용하는 것이 간편합니다. 

몇줄의 Makefile을 만들면 되거든요. 

 

다음은 테스트했던 Makefile 내용입니다.

 

MODULE_big = add_one
OBJS = add_one.o
REGRESS = add_one

PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)

다음은 여느 contrib 안에 있는 모듈처럼

make all && make install 

로 빌드해서 라이브러리 두는 곳에 두고, (복사 안하고 절대경로를 써도 되기는 합니다.)

 

db 접속해서, 

create function 으로 함수를 등록하면 됩니다. 

함수 등록이 두개의 정수형 인자를 받아야 하니까, 

create function add_one(int, int) returns int ... 이런 형태여야 하겠지요. 

 

제가 테스트 한 것으로 워낙 단숙한 함수라 별 특이 사항 없이 잘 빌드되고 작동을 잘 했습니다. 

V1, V0 문제가 아니라, 작업 도중 뭔가 착각을 했거나, 빼먹었거나, 다른 함수랑 헷갈렸거나 그럴 것 같네요. 

 

 

 

 

김상기(ioseph)님이 2015-07-09 11:11에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
9571text 구조체 파라미터 메모리 할당 후 반환 방법 [1]
초보DBA
2015-07-13
9134
9570PL단 C단 형변환.. [1]
초보DBA
2015-07-09
8889
9568데이터 가로 정렬 [2]
초보
2015-07-08
9297
9567PG_GETARG_INT32 관련.. [5]
초보DBA
2015-07-08
9120
9566에러 함수 관련... [2]
초보DBA
2015-07-07
10593
9565유저 확인방법.. [2]
초보DBA
2015-07-07
9033
9563pgbouncer 이용하려는데 잘 안되네요 [1]
심상호
2015-07-05
9859
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.048초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다