Oracleのストアドファンクションを呼び出す方法です。
System.Data.OracleClientを利用するので、参照設定を行ってください。
Oracleストアドファンクション呼出1と違うところは、引数にカーソルを返すところです。
説明に利用するストアドファンクションは、あるテーブルのデータをページング処理して、指定されたページのデータを引数に返すものです。
CREATE OR REPLACE FUNCTION TEST_PAGING(
in_PAGE IN NUMBER,
in_SQL IN VARCHAR2,
in_PAGE_SIZE IN NUMBER,
out_CURSOR OUT SYS_REFCURSOR
) RETURN NUMBER AS
/*
||////////////////////////////////////////////////////////////
||//
||// ファンクション名 :TEST_PAGING
||// ファンクション説明:指定ページのデータのみ取得する
||//
||////////////////////////////////////////////////////////////
|| in_PAGE :表示するページ
|| in_SQL :実行するSQL文
|| in_PAGE_SIZE :1ページのレコード件数
|| out_CURSOR :取得したカーソル
|| 戻り値 :-1以外=総ページ数、-1=異常
*/
--==================================================
--変数宣言
--==================================================
varSQL VARCHAR2(2000);
numCOUNT NUMBER;
numPAGE_COUNT NUMBER;
numSTR_ROW NUMBER;
numEND_ROW NUMBER;
--==================================================
--メイン処理開始
--==================================================
BEGIN
-- 総件数・総ページ数を取得する
varSQL := 'SELECT COUNT(*) FROM ('||in_SQL||')';
EXECUTE IMMEDIATE varSQL INTO numCOUNT;
numPAGE_COUNT := CEIL(numCOUNT / in_PAGE_SIZE);
-- 開始・終了位置を特定
numEND_ROW := in_PAGE * in_PAGE_SIZE;
numSTR_ROW := numEND_ROW - in_PAGE_SIZE + 1;
-- 抽出用SQL生成
varSQL := 'SELECT * FROM ( SELECT ROWNUM RN, A.* FROM ('
||in_SQL||') A ) WHERE RN BETWEEN '||numSTR_ROW||' AND '||numEND_ROW ;
-- カーソルオープン
OPEN out_CURSOR FOR varSQL;
RETURN numPAGE_COUNT;
EXCEPTION
WHEN OTHERS THEN
RETURN -1;
END TEST_PAGING;
上記のストアドファンクションを呼び出し、指定ページのデータをDataGridViewに表示します。
DataGridView、VScrollBarをフォームに配置します。配置されたスクロールバーがページと連動しています。
Imports System.Data.OracleClient
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
''DataGridViewの設定
With Me.DataGridView1
.AllowUserToAddRows = False
.AllowUserToDeleteRows = False
.ReadOnly = True
.ScrollBars = ScrollBars.Both
End With
''初期処理
With Me.VScrollBar1
.Minimum = 1
.Value = 1
.Maximum = Me.GetPageData(.Value)
End With
End Sub
Private Sub VScrollBar1_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles VScrollBar1.ValueChanged
Me.VScrollBar1.Maximum = Me.GetPageData(Me.VScrollBar1.Value)
End Sub
''' <summary>
''' 指定ページのデータをグリッドビューにセットする
''' </summary>
''' <param name="page">セットしたいページ番号</param>
''' <returns>-1以外:最大ページ番号、-1:エラー</returns>
''' <remarks></remarks>
Private Function GetPageData(ByVal page As Integer) As Integer
Dim oraBuilder As New OracleConnectionStringBuilder
''ORACLE接続文字列
With oraBuilder
.DataSource = "hogehoge"
.UserID = "user"
.Password = "password"
End With
Try
Using oraConn As OracleConnection = New OracleConnection(oraBuilder.ConnectionString)
Using oraCmd As New OracleCommand
oraConn.Open()
With oraCmd
.Connection = oraConn
.CommandType = CommandType.StoredProcedure
.CommandText = "TEST_PAGING"
.Parameters.Add(New OracleParameter("in_PAGE", _
OracleType.Number)).Value = page
.Parameters.Add(New OracleParameter("in_SQL", _
OracleType.VarChar)).Value = "SELECT * FROM TEST_DATA"
.Parameters.Add(New OracleParameter("in_PAGE_SIZE", _
OracleType.Number)).Value = 10
.Parameters.Add(New OracleParameter("out_CURSOR", _
OracleType.Cursor)).Direction = ParameterDirection.Output
.Parameters.Add(New OracleParameter("retValue", _
OracleType.Number)).Direction = ParameterDirection.ReturnValue
End With
Using oraDr As System.Data.OracleClient.OracleDataReader = oraCmd.ExecuteReader
Dim oraDt As New System.Data.DataTable
oraDt.Load(oraDr, Data.LoadOption.OverwriteChanges)
DataGridView1.DataSource = oraDt
End Using
Return CInt(oraCmd.Parameters("retValue").Value)
End Using
End Using
Catch ex As OracleException
MessageBox.Show(ex.Message, "ORACLE例外", MessageBoxButtons.OK, MessageBoxIcon.Error)
Catch ex As Exception
MessageBox.Show(ex.Message, "一般例外", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
Return -1
End Function
End Class
|