一番重要なのは、PL/SQL の改行コードに CRLF の CR を含めない事です。 :変数名 でバインドさせると、自動的に PL/SQL 側で変数として定義されます ここでは、テストの為に ParameterDirection.InputOutput を使っていますが、 入力データはもともと PL/SQL がテキストなので、文字列を置き換えて実行する 方法もあります。 関連する記事 http://logicalerror.seesaa.net/article/228467533.html もっと言えば、PL/SQL 側の動的 PL/SQL を使わないでも比較的簡単に 動的な SQL の実行が可能です。むしろ、パーツ化してマクロ化してしまえばより便利 になると思います。
DECLARE WK_STRING VARCHAR2(50); BEGIN WK_STRING := :RET_VALUE; DBMS_OUTPUT.PUT_LINE(:RET_VALUE); UPDATE 社員マスタ SET 氏名 = :RET_VALUE WHERE 社員コード = '0001'; DBMS_OUTPUT.PUT_LINE(WK_STRING); :RET_VALUE := '最終値'; END;
Imports System.Data Imports System.Data.OracleClient Imports System.IO Imports System.Text Module Module1 Sub Main() ' 新しい OracleConnection オブジェクトを作成 Dim myCon As OracleConnection = CreateConnection() if myCon is Nothing then Console.WriteLine("処理が異常終了しました") Return end if '--------------------------------------------------- ' キャラクタセット Dim SJIS_Enc As Encoding = Encoding.GetEncoding(932) ' 読み込み用 ' plsql.sql は、改行コードを LF のみにして下さい Dim ReadFile As StreamReader = New StreamReader( "plsql.sql", SJIS_Enc ) ' SHIFT_JIS で読み込み Dim SqlText As String = ReadFile.ReadToEnd() ReadFile.Close() Dim myCommand As New OracleCommand() myCommand.Connection = myCon Dim myParam1 As OracleParameter ' ******************************************* ' プロシージャの実行 ' ******************************************* ' 実行タイプ( SQLとして実行 ) myCommand.CommandType = CommandType.Text ' プロシージャ名 myCommand.CommandText = SqlText ' パラメータクリア myCommand.Parameters.Clear() ' 内容を取得する変数用パラメータ( OUT なので、Direction プロパティにセット ) myParam1 = myCommand.Parameters.Add("RET_VALUE", OracleType.Varchar) myParam1.Direction = ParameterDirection.InputOutput myParam1.Size = 50 ' 長さ myParam1.Value = "山田 太郎" Try ' 結果を受け取り、後で処理する myCommand.ExecuteNonQuery() Catch ex As Exception myCon.Close() Console.WriteLine(ex.Message) Return End Try Console.WriteLine(myParam1.Value) '--------------------------------------------------- Call EndConnection( myCon ) End Sub ' ****************************************************** ' 接続終了 ' ****************************************************** Sub EndConnection( myCon As OracleConnection ) ' 接続を閉じる myCon.Close() ' OracleConnection オブジェクトに使用されているすべてのリソースを解放 myCon.Dispose() ' 処理終了 Console.WriteLine("処理が終了しました") ' 一時停止 Console.Write("Enterキーを押して下さい : ") Console.ReadLine() End Sub ' ****************************************************** ' 接続作成 ' ****************************************************** Function CreateConnection( ) As OracleConnection ' 新しい OracleConnectionStringBuilder オブジェクトを作成 Dim builder As New OracleConnectionStringBuilder() ' 接続用のパラメータを追加 builder.Add("Server", "light/xe") builder.Add("User ID", "LIGHTBOX") builder.Add("Password", "LIGHTBOX") ' 内容を確認 Console.WriteLine(builder.ConnectionString) ' 新しい OracleConnection オブジェクトを作成 Dim myCon As New OracleConnection() ' 接続文字列を設定 myCon.ConnectionString = builder.ConnectionString ' 接続を開く Try myCon.Open() Catch ex As OracleException Console.WriteLine("接続エラーです") Console.WriteLine( ex.Message ) Return Nothing End Try Return myCon End Function End Module
|
【VB.NET : データベースの最新記事】
- VB.net : GetSchema メソッドでデータベース内のテーブル一覧と指定したテーブルの列名一覧を取得する
- VB.net : ListView に DB から読み込んだデータをセットする
- VB.net : 一時 PL/SQL で Data Pump Exportユーティリティと同じデータをエクスポートして処理結果を取得する
- VB.net : PL/SQL の OUT パラメータから実行結果を取得する
- VB.net : ODBC + MySQL で CSV をインポート( クラス化サンプル )
- VB.net : CSVによるインポート用ファイルの作成( つまりエクスポート )
- VB.net : insert 構文によるインポート用ファイルの作成( つまりエクスポート )
- VB.net 2008 : System.Data.Odbc データ取得(SELECT)処理( MySQL 5.1 )
- VB.net 2008 : System.Data.Odbc 更新処理( MySQL 5.1 )
- VB.net 2008 : System.Data.Odbc 接続テスト( MySQL 5.1 )
- VB.net : Oracle の行を返さない SQL の実行