
退会済みユーザー
2023/01/17 07:11 編集
削除
投稿2023/01/17 05:51
編集2023/01/18 02:38Windows 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: 引数の数または型が正しくありません。
PKG1.proc1の処理本体は自スキーマのシノニムを参照しています。そのシノニムは他スキーマのテーブルを参照しています。
前提として、「.CommandText = “{call PKG1.proc1(?,{resultset 1, NAME1, NAME2})}”」の文法的意味が不明なので理解したいです。
・外側の波括弧はどういう働きをしているのか
・内側の波括弧はどういう働きをしているのか
・「resultset 1, NAME1, NAME2」とは何か
2023/1/18追記:
新旧環境でOracle接続プロバイダが変わっていました。
旧環境: 不明
新環境: OraOLEDB.Oracle.1
回答1件
あなたの回答
tips
プレビュー