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

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

ただいまの
回答率

91.01%

  • VB.NET

    809questions

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

  • PL/SQL

    54questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 818

x_14_alonso

score 3

プログラム言語: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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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/22 16:10

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

    キャンセル

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

  • ただいまの回答率 91.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VB.NET

    809questions

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

  • PL/SQL

    54questions

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