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

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

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

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

Q&A

解決済

1回答

376閲覧

psqlodbc接続にてPostgreSQLのストアドプロシージャを実行したい

miyazato1970

総合スコア2

PostgreSQL

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

0グッド

0クリップ

投稿2024/02/01 12:25

編集2024/02/07 01:08

実現したいこと

psqlodbc接続にてPostgreSQLのストアドプロシージャを実行したいです。
※VB6からpsqlodbc接続にてPostgreSQLのストアドプロファンクションは実行できています。
※PostgreSQLのバージョンは15.5です。PostgreSQLはWindowsにインストールしています。
※psqlodbc ドライバは「psqlodbc_09_03_0300」を使用しています。

発生している問題・分からないこと

以下のVB6ソースコードにてストアドプロシージャを実行したつもりですが、
PostgreSQLのログ(インストール先の\15\data\log)を確認すると、以下の通り、プロシージャを実行する場合はCALLで実行する必要がある旨出力されております。
JST [5368] HINT: To call a procedure, use CALL.
JST [5368] STATEMENT: SELECT * FROM proc_test()

該当のソースコード

  Dim g_db_Con As New ADODB.Connection 'DB接続 Dim mCmd As New ADODB.Command '' コマンドオブジェクト Dim mRs As New ADODB.Recordset '' レコードセットオブジェクト If Open_Database(g_db_Con, "xxx.xxx.xxx.xxx", "db1", "postgres", "pass", 60) <> 0 Then Exit Sub End If Set mCmd = Nothing With mCmd strStored = "proc_test" .CommandText = strStored .CommandType = adCmdStoredProc .ActiveConnection = g_db_Con .CommandTimeout = 60 End With Set mRs = mCmd.Execute

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

Set mRs = mCmd.Executeを実行すると以下の例外が発生します。

・Err.Number
-2147467259
・Err.Description
ERROR: proc_test() is a procedure;
Error while executing the query)

補足

psqlodbcドライバのバージョンとpostgreSQLのバージョンは一致していると理解しています。(理解が間違えている可能性はあります)
ストアドプロシージャーがpostgreSQLに追加されたのはV11以降とのことですので、「psqlodbc_09_03_0300」ではストアドプロシージャに対応していない可能性があると思い、「psqlodbc_15_00_0000」のドライバをインストールし、同じソースで実行しました。
これで動作すると思いましたが、残念ながら現象は変わりませんでした。(VB6側のDescriptionもpostgreSQL側のLOGも同じ結果)

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

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

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

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

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

guest

回答1

0

自己解決

CommandTypeを"adCmdStoredProc"から"adCmdText"に変更し、
CommandTextにストアド名ではなく、"call proc_test()"をコーディングすることにより解決しました。

以下が修正したソースです。

With mCmd strSQL = "call proc_test()" .CommandText = strSQL .CommandType = adCmdText .ActiveConnection = g_db_Con .CommandTimeout = 60 End With mCmd.Execute

投稿2024/02/22 08:46

miyazato1970

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問