• 締切済み

VBからストアドプロシジャを実行

VBからストアドプロシジャを実行すると、下記のエラーが発生します。 型 'System.InvalidOperationException' の初回例外が Oracle.DataAccess.dll で発生しました オブジェクトの現在の状態に問題があるため、操作は有効ではありません。 テーブルとプロシジャはシステムユーザの管理下にあり、一般ユーザで接続しています。直接SQLを実行すると正しく動作しています。以下にコードを示しますが、どこに問題があるのでしょうか。システムユーザの管理下にある事より直接SQLを実行した時と同じ様に「system.xxx」としても結果は変わりませんでした。あと、一般ユーザにはconnectとselectの権限のみ与えています。 ■VB側のコード 'オブジェクト Dim oraCmd As New OracleCommand 'PL/SQLパラメタ Dim oraPrm1 As OracleParameter Dim oraPrm2 As OracleParameter ' 実行タイプ(PL/SQLとして実行) oraCmd.CommandType = CommandType.StoredProcedure ' プロシージャ名 oraCmd.CommandText = "GETNAME" ' パラメータクリア oraCmd.Parameters.Clear() ' 1つ目のパラメータ( IN なのでデータセット ) oraPrm1 = oraCmd.Parameters.Add("PM_STRING", OracleDbType.Varchar2) oraPrm1.Value = "2001" oraPrm1.Direction = ParameterDirection.Input ' 2つ目のパラメータ( OUT なので、Direction プロパティにセット ) oraPrm2 = oraCmd.Parameters.Add("PM_NUMBER", OracleDbType.Int16) oraPrm2.Direction = ParameterDirection.Output Try ' 結果を受け取り、後で処理する oraCmd.ExecuteNonQuery() Catch ex As Exception conn.Close() Console.WriteLine(ex.Message) Return End Try Console.WriteLine(oraPrm2.Value.GetType()) ■ストアドプロシジャ CREATE OR REPLACE PROCEDURE GETNAME (IN1 IN NUMBER, OUT1 OUT VARCHAR2) AS BEGIN select NAME INTO OUT1 from TEST where CODE = IN1; END GETNAME;

みんなの回答

noname#212058
noname#212058
回答No.3

> 何か余計酷くなったみたいですが、PL/SQLでエラーが > 出たので少しは先に進んだのでしょうか? 大きく前進しています。先のコードでは ORACLE にコマンド実行すらできていませんでしたが、今回は実行はできていますので。 > PLS-00201: 識別子GETNAMEを宣言してください。 GETNAME というストアドが存在しないか、実行権限がないと発生します。おそらく接続ユーザにストアドの実行権限がないのかと。

saki0113
質問者

補足

色々ありがとうございました。 とりあえずPL/SQLは実行できるようになりましたが 今度は下記のエラーが出ます。 ORA-06502: PL/SQL: 数値または値のエラーが発生しました ググったらNULLがどうたらと書かれているのですが、 どこがNULLになっているのか分かりません。 ' パラメータクリア oraCmd.Parameters.Clear() ' 1つ目のパラメータ(INなのでvalueプロパティにデータセット) oraPrm1 = oraCmd.Parameters.Add("PM_NUMBER", OracleDbType.Int16) oraPrm1.Value = 2001 ' 2つ目のパラメータ(OUTなのでDirectionプロパティにセット) oraPrm2 = oraCmd.Parameters.Add("PM_STRING", OracleDbType.Varchar2) oraPrm2.Direction = ParameterDirection.Output create or replace PROCEDURE GETNAME (PM_NUMBER IN NUMBER, PM_STRING OUT VARCHAR2) AS BEGIN select NAME INTO PM_STRING from system.TEST where CODE = PM_NUMBER; END GETNAME;

noname#212058
noname#212058
回答No.2

Dim conn As New OracleConnection(conStr) oraCmd.Connection = conn; このふたつのコードは、全く別のモノです。 ・上は OracleConnection のインスタンスを作るもの ・下は『作った OracleConnection を、oraCmd に設定するもの』 です。下のコードが Dim oraCmd As New OracleCommand の下に書かれていないので、問題が発生しています。試しに書いてみてください。

saki0113
質問者

補足

Dim conn As New OracleConnection(conStr) Dim oraCmd As New OracleCommand oraCmd.Connection = conn 何か余計酷くなったみたいですが、PL/SQLでエラーが出たので少しは先に進んだのでしょうか? 型 'Oracle.DataAccess.Client.OracleException' の初回例外が Oracle.DataAccess.dll で発生しました ORA-06550: 行1、列7: PLS-00201: 識別子GETNAMEを宣言してください。 ORA-06550: 行1、列7: PL/SQL: Statement ignored 追加する前もconn.Open()は正常に動作しているので、別の原因の様な気もするのですが…

noname#212058
noname#212058
回答No.1

oraCmd にコネクションが設定されていないようですが。 oraCmd.Connection = conn; の実行が抜けてるんじゃないですか?

saki0113
質問者

補足

今回の問題とは直接関係無い(というかそれが抜けていたら直接SQLを実行しても動かないはず)と思って書いていませんでした。実際はその前に下記のコードがあります。 Dim conn As New OracleConnection(conStr)