こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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;

投稿日時 - 2015-09-05 15:28:33

QNo.9042471

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

> 何か余計酷くなったみたいですが、PL/SQLでエラーが
> 出たので少しは先に進んだのでしょうか?

大きく前進しています。先のコードでは ORACLE にコマンド実行すらできていませんでしたが、今回は実行はできていますので。

> PLS-00201: 識別子GETNAMEを宣言してください。

GETNAME というストアドが存在しないか、実行権限がないと発生します。おそらく接続ユーザにストアドの実行権限がないのかと。

投稿日時 - 2015-09-05 19:25:39

補足

色々ありがとうございました。
とりあえず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;

投稿日時 - 2015-09-05 20:49:17

Dim conn As New OracleConnection(conStr)
oraCmd.Connection = conn;

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

投稿日時 - 2015-09-05 18:20:02

補足

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()は正常に動作しているので、別の原因の様な気もするのですが…

投稿日時 - 2015-09-05 18:55:55

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

投稿日時 - 2015-09-05 15:54:25

補足

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

Dim conn As New OracleConnection(conStr)

投稿日時 - 2015-09-05 17:57:05

あなたにオススメの質問