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

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

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

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

13282閲覧

VB.NETからPL/SQLを呼び出し DataTable型で受け取る

x_14_alonso

総合スコア11

PL/SQL

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

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2017/09/21 06:02

プログラム言語:VB.NET
DB:Oracle11g

以下の通りプログラムを改修する必要があるのですが、そもそも可能なのかすらわからず解決できていません。
VB.NET側の記述方法とPL/SQL(Procedure)側の記述方法についてご教授いただけますでしょうか。

【現在】
VB.NETのロジック上でSQL文(SELECT)をべた書き(文字列型)で作成し、
OracleConnectionとOracleAdapterを使用してOracleDBからデータを取得。
DataTable型として受け取る

【改修後】
VB.NETのロジックからPL/SQL(Procedure)を呼び出し上記と同じSELECTを行う。
OracleConnectionとOracleAdapterを使用してOracleDBからデータを取得。
DataTable型として受け取る

【わかっている範囲】
VB.NETからPL/SQLを呼び出す方法は判明しています。
また、そのPL/SQLからString型でデータを取得する方法もわかっています。
DataTable型で受け取る方法がわかっておりません。

【現在のソース】

Public Function GetEmpName(ByVal empNo As String) As DataTable Dim SQL As StringBuilder Dim tableName As String = String.Empty Dim connect As Global.Oracle.DataAccess.Client.OracleConnection = Nothing Dim adapt As Global.Oracle.DataAccess.Client.OracleDataAdapter Dim ds As DataSet = Nothing GetEmpName = Nothing tableName = "TEMP_TABLE_NAME" '接続設定(ここは改修後も変わりないとおもっています) connect = New Global.Oracle.DataAccess.Client.OracleConnection() connect.ConnectionString = Global.DataAccess.My.MySetting.Default.ConnectionString connect.Open() adapt = New Global.Oracle.DataAccess.Client.OracleDataAdapter() adapt.SelectCommand = New Oracle.DataAccess.Client.OracleCommand() adapt.SelectCommand.Connection = connect ds = New DataSet SQL.Clear() SQL.AppendLine("SELECT") SQL.AppendLine("EMP_NO") SQL.AppendLine(",EMP_NAME") SQL.AppendLine("FROM EMP_TABLE") SQL.AppendLine("WHERE EMP_NO = '"& empNo & "'") adapt.SelectCommand.CommandText = SQL.ToString() adapt.Fill(ds,tableName) GetEmpName = ds.Tables(tableName) End Function

以上です。よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

自己解決

VB.NET側からはInputOutputパラメータとして、"RefCursor"型を設定。(中身は空)
Procedure側ではin out SYS_REFCURSORとして定義。
上記CURSORをOPENし、SELECT文により値を詰める。

VB.NETでは同じ受け取り型で受け取ることができました。
adapt.Fill(ds,tableName)
GetEmpName = ds.Tables(tableName)

投稿2017/09/22 07:09

x_14_alonso

総合スコア11

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

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

0

Oracle には触ったこともない自分がレスするのは何ですが・・・

DataTable型で受け取る方法がわかっておりません。

以下の記事は SQL Server + SqlClient + ADO.NET の場合ですが、ストアドプロシージャと aspx ファイルの CreateDataSource メソッドを見てください。

カスタムページャー
http://surferonwww.info/BlogEngine/post/2010/08/25/Custom-pager.aspx

ストアドは pageNum と pageSize という 2 つの入力をベースに SELECT * ... というクエリで複数のレコードを返すとともに pageCount というパラメータを OUTPUT として返します。

CreateDataSource メソッドはそのストアドを使って SELECT * ... というクエリで抽出した複数のレコードを DataTable に格納して返しています。

ODP.NET が SQL Server の SqlClient と同等に作ってあれば同様な方法で可能だと思います。

ODP.NET は SqlClient とは違っていて、上記がハズレでしたらすみません。

投稿2017/09/21 06:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

x_14_alonso

2017/09/22 07:10

ご回答ありがとうございます。 申し訳ありません、私は"SQL Server + SqlClient + ADO.NET "の方式を実装したことがなく ご指定いただいた記事は難しかったです。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問