質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

1367閲覧

ADO経由のPL/SQLエラー

D.G.

総合スコア7

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2023/01/17 05:51

編集2023/01/18 02:38

前提

Windows 8上で動いているVB.NETのプログラム(Oracle11g R2と通信)があります。ソースはありますが、作成者は不明です。
このプログラムがWindows 10上でOracle19cと通信しても正常に動くか・動かない場合の修正内容を確認しています。

実現したいこと

  • パッケージ化されたストアドプロシージャを実行し、検索結果を取得したい

発生している問題・エラーメッセージ

ORA-06550: 行1、列30: PLS-00201: 識別子NAME1を宣言してください。 ORA-06550: 行1、列7: PL/SQL: Statement ignored

該当のソースコード

下記のソースが、「Win8+Oracle11g」では動作し、「Win10+Oracle19c」ではエラーとなりました。
※目視を使った転記のため、誤字等あるかもしれません。見つかり次第修正いたします。

PACKAGE定義

1PACKAGE PKG1 AS 2 TYPE tNAME1 is TABLE of VARCHAR2(64) INDEX BY BINARY_INTEGER; 3 TYPE tNAME2 is TABLE of VARCHAR2(64) INDEX BY BINARY_INTEGER; 4 5 PROCEDURE proc1 6 ( 7 in1 IN char, 8 NAME1 OUT tNAME1, 9 NAME2 OUT tNAME2 10 ); 11 12END PKG1;

PACKAGE

1PACKAGE BODY PKG1 AS 2 PROCEDURE proc1 3 ( 4 in1 IN char, 5 NAME1 OUT tNAME1, 6 NAME2 OUT tNAME2 7 ) 8 IS 9 (以降、処理本体)

VB.NET

1Dim objRS As New ADODB.RecordSet 2Dim objParam As New ADODB.Parameter 3Dim objCmd As New ADODB.Command 4With objRS 5 .CursorType = ADODB.CursorTypeEnum.adOpenStatic 6 .LockType = ADODB.LockTypeEnum.adLockReadOnly 7End With 8 9With objCmd 10 .let_ActiveConnection(conADO) ‘conADOはADODB.Connection型。事前に接続済み。 11 .CommandType = ADODB.CommandTypeEnum.adCmdText 12 objParam = .CreateParameter(“input”, ADODB.DataTypeEnum.adVarChar, ADODB.ParameterDirectionEnum.adParamInput, Len(strInput), strInput) ‘ strInputはstring型の引数 13 .Parameters.Append(objParam) 14 .CommandText = “{call PKG1.proc1(?,{resultset 1, NAME1, NAME2})}” 15End With 16 17objRS.Source = objCmd 18objRS.Open() ‘ ここでエラー 19‘以降、objRS.Fields(“NAME1”).Value、objRS.Fields(“NAME2”).Valueを参照して処理 20

試したこと

CommandTextを変えた場合のエラーの変化を見ました。

元のソース(上記「VB.NET」の14行目):

.CommandText = “{call PKG1.proc1(?,{resultset 1, NAME1, NAME2})}”

試した修正内容:

.CommandText = “{call PKG1.proc1(?,{resultset 1, NAME1})}”

→PLS-00201: 識別子NAME1を宣言してください。(エラーメッセージ変わらず)

.CommandText = “{call PKG1.proc1(?,{resultset 1, NAME3})}”

→ PLS-00201: 識別子NAME3を宣言してください。
※元のエラーメッセージの「NAME1」という文字列がVB.NETのソースを参照したのかプロシージャを参照したのか不明だったため、これを試しました。

.CommandText = “{call PKG1.proc1(?)}”

→ PLS-00306: 引数の数または型が正しくありません。

補足情報(FW/ツールのバージョンなど)

PKG1.proc1の処理本体は自スキーマのシノニムを参照しています。そのシノニムは他スキーマのテーブルを参照しています。

前提として、「.CommandText = “{call PKG1.proc1(?,{resultset 1, NAME1, NAME2})}”」の文法的意味が不明なので理解したいです。
・外側の波括弧はどういう働きをしているのか
・内側の波括弧はどういう働きをしているのか
・「resultset 1, NAME1, NAME2」とは何か

2023/1/18追記:
新旧環境でOracle接続プロバイダが変わっていました。
旧環境: 不明
新環境: OraOLEDB.Oracle.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/01/17 07:11 編集

削除
sazi

2023/01/17 08:55

> Windows 8上で動いているVB.NETのプログラム(Oracle11g R2と通信)があります 手を加えたものだけでの質問とはせず、元のソースも質問に追記した方が良いかと思います。 後は基本的なところ[oracleの型(特に配列)、ADODB]を調べておくと、回答があった場合に理解が早いと思います。
KOZ6.0

2023/01/17 09:42

本当にこのソースで動いてますか? 実行されている exe とソースコードが違っているということはないでしょうか?
D.G.

2023/01/17 11:11

> sazi さん コメントいただきありがとうございます。 「該当ソースコード」の記載は手を加えていない(環境を変えたことで動かなくなった)ソースなので、 その旨を本文内に追記しました。 ご指摘いただいた箇所は初学者ですが、学習を進めさせていただきます。 > KOZ6.0 さん コメントいただきありがとうございます。 実際に旧環境(Win8+Oracle11g)で動いているEXEを持ち出して新環境で動かしても ソースを再ビルドして動かしても、同じ現象が発生します。 このことから、ソースとEXEの不一致による問題ではないと考えています。 質問本文内のソースコードは目視で転記しているため、そのタイミングでの誤りは可能性が潰せていません。 ※この旨をソースコード欄の冒頭に追記しました。
KOZ6.0

2023/01/17 12:53

接続文字列の Provider= の後はどうなっていますか? 連想配列は MSDAORA(Microsoft製) だと動作していたようですが、OraOLEDB(Oracle製) だと動かないようです。 https://community.oracle.com/tech/developers/discussion/624234/problem-using-associative-arrays-in-vb6-with-oraoledb-for-oracle-10g System.Data.OracleClient の話ではあるのですが、11g → 12c になったとき、ストアドの OUT 引数で不具合が出ていましたので MSDAORA も同じように不具合が出ているのかもしれません。
KOZ6.0

2023/01/17 14:21 編集

回答に記入します。
D.G.

2023/01/18 00:09

> KOZ6.0 さん ありがとうございます。 > 接続文字列の Provider= の後はどうなっていますか? DB接続は、あるパッケージ製品のSDKを経由して実施しております。パッケージ製品側にも仕様を確認するようにいたします。
KOZ6.0

2023/01/18 01:41 編集

接続文字列は conADO の ConnectionString プロパティで取得できるはず。 MSDASQL(Microsoft OLE DB Provider for ODBC) かもしれないですね。 その場合は DataDirect の ODBC ドライバだと動くかもしれません。 https://www.ashisuto.co.jp/datadirect/
D.G.

2023/01/18 02:06

> KOZ6.0 さん ありがとうございます。調べたところ、 ConnectionStringのProviderがOraOLEDB.Oracle.1となっていました。 追加で環境の確認をしたところ、前提パッケージ製品がOracle19c対応のためドライバを変更していたとのことです。 昨日いただいたコメントと併せて考えると、これが原因ということのようです。 プロシージャをOraOLEDB版に書き換えます。
guest

回答1

0

ベストアンサー

{call PKG1.proc1(?,{resultset 1, NAME1, NAME2})} の {resultset ~ の部分については

「ストアド プロシージャから返される配列パラメーター」
https://learn.microsoft.com/ja-jp/sql/odbc/microsoft/returning-array-parameters-from-stored-procedures?view=sql-server-ver16

を参照してください。

.NET で COMベースの ADODB を使うのはお勧めできません。
ODP.NET を使うよう書き換えるべきです。

「PL/SQL連想配列の使用」
https://www.oracle.com/jp/database/technologies/oramag/o17odp.html

投稿2023/01/17 14:23

KOZ6.0

総合スコア2626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

D.G.

2023/01/17 22:54

ありがとうございます。ソースコードの記述の意味についてよく理解できました。 当該プログラムは元々VB6だったのを低予算で機械的に.NET化したものとなっており、ご指摘のように.NETとして不適切な実装が多々ある状態です。直したい思いはあるものの、予算が取れず改善できないのが現状です。 新環境でのエラーについて、確認作業を継続して参ります。
D.G.

2023/01/18 02:44

質問にいただいたコメントにより、接続プロバイダの変更による原因であることが突き止められました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問