質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

Q&A

解決済

1回答

3398閲覧

PostgreSQL C言語関数 FUNCTIONのOUT引数型の使い方について

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

0グッド

0クリップ

投稿2016/08/02 12:53

ご協力をお願いいたします。

☆頂きたい回答
1)OUT型引数に返却値を戻すC言語のサンプルプログラム
2)外部から当該関数を呼び出し返却値を確認する PL/SQL サンプルプログラム

☆留意点
関数呼び出し時の3つのOUT引数は変えたくない、それ以外は変更可
PostgreSQL 9.2
RHLE7.1

■C言語関数宣言

DROP FUNCTION test_func(OUT INTEGER, OUT INTEGER, OUT INTEGER); CREATE OR REPLACE FUNCTION test_func( OUT ret1 INTEGER, OUT ret2 INTEGER, OUT ret3 INTEGER ) AS '/Work/9.2/Extender.so', 'test_func' LANGUAGE C IMMUTABLE STRICT;

■実行結果(空値が戻ります)

-bash-4.2$ psql postgres=# select * FROM test_func(); ret1 | ret2 | ret3 ------+-----------+------- | |

■テンプレート

#include <postgres.h> #include <string.h> #include <funcapi.h> #include <utils/acl.h> #include <utils/geo_decls.h> #include <utils/builtins.h> #ifdef PG_MODULE_MAGIC PG_MODULE_MAGIC; #endif /* PG_MODULE_MAGIC */ PG_FUNCTION_INFO_V1(test_func); test_func(PG_FUNCTION_ARGS){ fcinfo->arg[0] = 1; fcinfo->arg[1] = 2; fcinfo->arg[2] = 3; PG_RETURN_NULL(); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

#include <postgres.h> #include <string.h> #include <funcapi.h> #include <utils/acl.h> #include <utils/geo_decls.h> #include <utils/builtins.h> #ifdef PG_MODULE_MAGIC PG_MODULE_MAGIC; #endif /* PG_MODULE_MAGIC */ PG_FUNCTION_INFO_V1(test_func); test_func(PG_FUNCTION_ARGS){ TupleDesc tupdesc; AttInMetadata *attinmeta; HeapTuple tuple; Datum result; if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) { ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("function returning record called in context " "that cannot accept type record"))); } attinmeta = TupleDescGetAttInMetadata(tupdesc); values = (char **) palloc(3 * sizeof(char *)); values[0] = (char *) palloc( 16 * sizeof(char) + 1); values[1] = (char *) palloc( 16 * sizeof(char) + 1); values[2] = (char *) palloc( 16 * sizeof(char) + 1); snprintf(values[0], 16, "%d", 4); snprintf(values[1], 16, "%s", 5); snprintf(values[2], 16, "%d", 6); tuple = BuildTupleFromCStrings(attinmeta, values); result = HeapTupleGetDatum(tuple); }
test_func ------------ (4,5,6) (1行)

投稿2016/08/04 04:51

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問