HIRO's.NET Blog

PowerShellが好き

目次

Blog 利用状況

ニュース

あわせて読みたい

書庫

日記カテゴリ

リンク

VB.NETからOracleストアドプロシージャを呼び出す その4

前回(その3)は引数ありのストアドプロシージャ のOUTパラメータを受け取る方法を紹介しました。

今回は、REF CURSORをOUT引数として持つストアドプロシージャをVB.NETでDataReaderに受け取る方法を紹介します。

 

開発言語:VB.NET 2005

使用するテーブルは、Oracleを使用している人であればおなじみの、scott/tigerのEMP表です。

ストアドプロシージャは下記の通りです。

(例によって深い意味はありません。説明用です。)

ストアドプロシージャ4
CREATE OR REPLACE PACKAGE SCOTT.PKG_TEST1
IS
TYPE ref_cursor IS REF CURSOR;
Procedure PROCEDURE4(in_EMPNO IN VARCHAR2, in_ENAME IN VARCHAR2, in_DEPTNO IN NUMBER, out_cursor OUT ref_cursor);
END;
/

CREATE OR REPLACE PACKAGE BODY SCOTT.PKG_TEST1 AS
Procedure PROCEDURE4 (
    in_EMPNO    in varchar2,
    in_ENAME    in varchar2,
    in_DEPTNO   in number,
    out_CURSOR  OUT ref_cursor
)
IS
    varSQL varchar2(2000);
BEGIN
    INSERT INTO EMP (EMPNO, ENAME, DEPTNO) VALUES (in_EMPNO, in_ENAME, in_DEPTNO);

    -- open cursor
    varSQL := 'SELECT * FROM EMP WHERE DEPTNO=' || in_DEPTNO;
    OPEN out_CURSOR FOR varSQL;
END PROCEDURE4;
END PKG_TEST1;
/

 以下、ODP.NET, MicorosoftのOracleClient, OleDB の3種類を使用してPROCEDURE4を呼び出す例です。

 ストアドプロシージャのINパラメータをVB.NETから指定する方法はその2で説明した通りです。

 今回は、ストアドプロシージャのOUTパラメータをVB.NETのDataReaderに受け取る方法について説明します。

 まず、OracleParameterのインスタンスを作成します。(OleDBの場合は作成しません。)

 OracleParameterのインスタンス作成時の第1引数には、ストアドプロシージャのREF CUROSOR(OUT引数)名(この場合は"out_cursor")、第2引数にはストアドプロシージャOUT引数の型に合わせたものを指定します。(今回の場合、OracleのREF CURSOR型に対して、ODP.NETの場合はOracleDbType.RefCursor、OracleClientの場合はOracleType.Cursor

 次に、PrameterDirectionにOutputを指定します。(これはストアドプロシージャout_cursorがOUT引数であるため)

 あとはDataReaderを作成し、Readメソッドを使用することで、1レコードずつ処理をすることができます。

 

■ODP.NETサンプル
Private Sub ODP_TEST4()
    Try
        Using OraConn As New OracleConnection("user id=scott;password=tiger;data source=YourServer")
            Using Cmd As New OracleCommand
                'データベース接続を開く
                OraConn.Open()
                Cmd.Connection = OraConn
                'コマンドタイプをストアドプロシージャにする
                Cmd.CommandType = CommandType.StoredProcedure
                '実行するストアドプロシージャを指定
                Cmd.CommandText = "PKG_TEST1.PROCEDURE4"
                'ストアドプロシージャの引数に渡す値の設定
                Cmd.Parameters.Add("in_EMPNO", OracleDbType.Varchar2).Value = "7777"
                Cmd.Parameters.Add("in_ENAME", OracleDbType.Varchar2).Value = "HIRO"
                Cmd.Parameters.Add("in_DEPTNO", OracleDbType.Decimal).Value = 20
                'ストアドプロシージャのout cursor用パラメータ作成
                Dim outPara As New OracleParameter("out_CURSOR", OracleDbType.RefCursor)
                outPara.Direction = ParameterDirection.Output
                Cmd.Parameters.Add(outPara)

                Dim OraRead As OracleDataReader
                OraRead = Cmd.ExecuteReader

                ListBox1.Items.Clear()
                'データの取り出し
                While OraRead.Read
                    ListBox1.Items.Add(OraRead.GetString(OraRead.GetOrdinal("ENAME")))
                End While

                MessageBox.Show("PROCEDURE4 正常終了", "SUCCESS", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Using
        End Using

    Catch OraEx As OracleException
        'Oracle例外発生時
        MessageBox.Show(OraEx.Message, "ORACLE ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop)

    Catch ex As Exception
        '一般例外発生時
        MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop)
    End Try
End Sub

■OracleClientサンプル
Private Sub OracleClient_TEST4()
    Try
        Using OraConn As New OracleConnection("user id=scott;password=tiger;data source=YourServer")
            Using Cmd As New OracleCommand
                'データベース接続を開く
                OraConn.Open()
                Cmd.Connection = OraConn
                'コマンドタイプをストアドプロシージャにする
                Cmd.CommandType = CommandType.StoredProcedure
                '実行するストアドプロシージャを指定
                Cmd.CommandText = "PKG_TEST1.PROCEDURE4"
                'ストアドプロシージャの引数に渡す値の設定
                Cmd.Parameters.Add("in_EMPNO", OracleType.VarChar).Value = "7777"
                Cmd.Parameters.Add("in_ENAME", OracleType.VarChar).Value = "HIRO"
                Cmd.Parameters.Add("in_DEPTNO", OracleType.Number).Value = 20
                'ストアドプロシージャのout cursor用パラメータ作成
                Dim outPara As New OracleParameter("out_CURSOR", OracleType.Cursor)
                outPara.Direction = ParameterDirection.Output
                Cmd.Parameters.Add(outPara)
                Dim OraRead As OracleDataReader
                OraRead = Cmd.ExecuteReader

                ListBox1.Items.Clear()
                'データの取り出し
                While OraRead.Read
                    ListBox1.Items.Add(OraRead.GetString(OraRead.GetOrdinal("ENAME")))
                End While

                MessageBox.Show("PROCEDURE4 正常終了", "SUCCESS", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Using
        End Using

    Catch OraEx As OracleException
        'Oracle例外発生時
        MessageBox.Show(OraEx.Message, "ORACLE ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop)

    Catch ex As Exception
        '一般例外発生時
        MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop)
    End Try
End Sub

■OleDBサンプル
Private Sub OleDB_TEST4()
    Try
        Using OraConn As New OleDbConnection("Provider=MSDAORA.1.Oracle;user id=scott;password=tiger;data source=YourServer;PLSQLRset=True")
            Using Cmd As New OleDbCommand
                'データベース接続を開く
                OraConn.Open()
                Cmd.Connection = OraConn
                'コマンドタイプをストアドプロシージャにする
                Cmd.CommandType = CommandType.StoredProcedure
                ''実行するストアドプロシージャを指定
                Cmd.CommandText = "PKG_TEST1.PROCEDURE4"
                'ストアドプロシージャの引数に渡す値の設定
                Cmd.Parameters.Add("in_EMPNO", OleDbType.VarChar).Value = "7777"
                Cmd.Parameters.Add("in_ENAME", OleDbType.VarChar).Value = "HIRO"
                Cmd.Parameters.Add("in_DEPTNO", OleDbType.Decimal).Value = 20

                Dim OraRead As OleDbDataReader
                OraRead = Cmd.ExecuteReader

                ListBox1.Items.Clear()
                'データの取り出し
                While OraRead.Read
                    ListBox1.Items.Add(OraRead.GetString(OraRead.GetOrdinal("ENAME")))
                End While

                MessageBox.Show("PROCEDURE4 正常終了", "SUCCESS", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Using
        End Using

    Catch OleEx As OleDbException
        'Oracle例外発生時
        MessageBox.Show(OleEx.Message, "OleDB ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop)

    Catch ex As Exception
        '一般例外発生時
        MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Stop)
    End Try
End Sub


投稿日時 : 2007年4月20日 20:37

コメントを追加

# VB.NETからOracleストアドプロシージャを呼び出す その5 2007/05/14 13:22 HIRO's.NET Blog

VB.NETからOracleストアドプロシージャを呼び出す その5

# chanel 2.55 online shop 2015/09/10 12:32 zxezvwrcb@aol.com

2/32-34-35
chanel 2.55 online shop http://www.replicasbag.net/de/-c87_88/

# best essay websites h164jb 2022/09/08 20:05 AaronBlact


Nicely put. Kudos. https://definitionessays.com/ how to write a good history essay

# writing a college essay about yourself s80lsh 2022/09/08 20:25 Charlosmox


Amazing tons of wonderful tips! https://definitionessays.com/ content writing services usa

# homework help accounting x251ud 2023/02/09 3:33 Albertosed


Seriously lots of very good advice!

https://service-essay.com/ write my papers

# can somebody write my essay f452vv 2023/02/10 1:40 Albertosed


Regards. I value it!
https://essaywritingservicelinked.com/ business letter writing help

# essay order online k59pao 2023/02/26 18:45 CharlesSnoff


With thanks! A lot of content!
pay for paper writing https://quality-essays.com/ buy online essays

# order dissertation g744pw 2023/02/27 9:25 Robertsaids


Amazing forum posts. Appreciate it!
phd research paper https://dissertationwritingtops.com/ uk dissertation writing help

# thesis writer online l515gg 2023/03/03 7:04 Josephbried


Nicely put. Cheers!
writing with a thesis https://writingthesistops.com/ make my thesis statement

# editing dissertations n33zfo 2023/03/06 12:50 EugeneSib


Terrific info, Thanks a lot!
uc essay help https://customthesiswritingservice.com writing a doctoral thesis https://essaywritingservicehelp.com

# dissertation write up a35bfg 2023/03/07 3:49 Gregorysaipt


Appreciate it! A lot of advice!
how do u write an essay https://domycollegehomeworkforme.com writing a perfect essay https://phdthesisdissertation.com

# write my essay please s41sdz 2023/03/09 0:26 Gregorysaipt


You definitely made the point!
professional essay writers for hire https://essaywritingservicebbc.com how to write effective essays https://writingpaperforme.com

# buy an essay cheap z93rdg 2023/03/10 23:30 EugeneSib


Valuable forum posts. With thanks!
best web content writing services https://custompaperwritersservices.com medical school essay help https://writingthesistops.com

# writer essay n173dc 2023/03/11 17:16 Gregorysaipt


Very good data. Cheers.
how to write an mba essay https://quality-essays.com write my essay for me cheap https://writingpaperforme.com

# how to write a comparing and contrasting essay e81yty 2023/03/13 10:39 EugeneSib

You actually explained it really well!
how to write an essay about yourself for college https://domycollegehomeworkforme.com phd writers https://argumentativethesis.com

# essays writing b824oe 2023/03/13 12:45 Gregorysaipt

You actually revealed that really well.
dissertation versus thesis https://essayssolution.com how to write an introduction for an expository essay https://ouressays.com

# writing prompts for college essays q906fv 2023/03/14 1:27 EugeneSib


Seriously plenty of fantastic advice!
help me write my thesis https://argumentativethesis.com how to write a great essay for college https://helpwritingdissertation.com

# online essay writers wanted t72urj 2023/04/02 22:49 EugeneSib


Whoa plenty of excellent information!
custom report writing service https://essaywritingserviceahrefs.com persuasive writing essays https://essaywritingservicehelp.com

# The plugins developed for WordPress 2023/05/09 23:16 Justas

The plugins developed for WordPress serve to enhance the features and functions of a WordPress website, allowing you to build your awesome and functional site https://t.me/wpigaming/648 Customise WordPress with powerful, professional and intuitive fields.

# paxlovid buy https://paxlovid.bid/ Paxlovid buy online 2023/10/26 2:31 Paxlovid

paxlovid buy https://paxlovid.bid/ Paxlovid buy online

# farmacia online https://farmaciait.pro/ farmacia online migliore 2023/12/04 12:45 Farmacia

farmacia online https://farmaciait.pro/ farmacia online migliore

# ed drug prices https://edpills.tech/# cheap ed pills 2023/12/23 11:02 EdPills

ed drug prices https://edpills.tech/# cheap ed pills

# Clava is the best 2025/05/09 9:54 Danielthash

Wow news for all us

タイトル
名前
URL
コメント