質問編集履歴

3

新旧環境でOracle接続プロバイダが変わっていた旨を追記しました。

2023/01/18 02:38

投稿

D.G.
D.G.

スコア7

test CHANGED
File without changes
test CHANGED
@@ -99,3 +99,8 @@
99
99
  ・外側の波括弧はどういう働きをしているのか
100
100
  ・内側の波括弧はどういう働きをしているのか
101
101
  ・「resultset 1, NAME1, NAME2」とは何か
102
+
103
+ 2023/1/18追記:
104
+ 新旧環境でOracle接続プロバイダが変わっていました。
105
+ 旧環境: 不明
106
+ 新環境: OraOLEDB.Oracle.1

2

「該当のソースコード」および「試したこと」に注釈を追記しました。

2023/01/17 10:55

投稿

D.G.
D.G.

スコア7

test CHANGED
File without changes
test CHANGED
@@ -17,6 +17,9 @@
17
17
  ```
18
18
 
19
19
  ### 該当のソースコード
20
+
21
+ 下記のソースが、「Win8+Oracle11g」では動作し、「Win10+Oracle19c」ではエラーとなりました。
22
+ ※目視を使った転記のため、誤字等あるかもしれません。見つかり次第修正いたします。
20
23
 
21
24
  ```PACKAGE定義
22
25
  PACKAGE PKG1 AS
@@ -72,11 +75,18 @@
72
75
 
73
76
  CommandTextを変えた場合のエラーの変化を見ました。
74
77
 
78
+ 元のソース(上記「VB.NET」の14行目):
79
+
80
+ .CommandText = “{call PKG1.proc1(?,{resultset 1, NAME1, NAME2})}”
81
+
82
+ 試した修正内容:
83
+
75
84
  .CommandText = “{call PKG1.proc1(?,{resultset 1, NAME1})}”
76
- →エラーメッセージ変わらず
85
+ PLS-00201: 識別子NAME1を宣言してください。(エラーメッセージ変わらず
77
86
 
78
87
  .CommandText = “{call PKG1.proc1(?,{resultset 1, NAME3})}”
79
88
  → PLS-00201: 識別子NAME3を宣言してください。
89
+  ※元のエラーメッセージの「NAME1」という文字列がVB.NETのソースを参照したのかプロシージャを参照したのか不明だったため、これを試しました。
80
90
 
81
91
  .CommandText = “{call PKG1.proc1(?)}”
82
92
  → PLS-00306: 引数の数または型が正しくありません。

1

誤投稿をそのままにしてしまっておりました、失礼致しました。

2023/01/17 06:41

投稿

D.G.
D.G.

スコア7

test CHANGED
File without changes
test CHANGED
@@ -1,30 +1,91 @@
1
1
  ### 前提
2
2
 
3
- ここに質問の内容を詳しく書いてください。
3
+ Windows 8上で動いているVB.NETのプログラム(Oracle11g R2と通信)がありますソースはありますが、作成者は不明です。
4
- (例)
5
- Windows Server 2012 R2上で動いているVB.NETプロ
4
+ このプログラムがWindows 10上でOracle19cと通信しても正常にくか・動かな場合の修正内容を確認しています。
6
5
 
7
6
  ### 実現したいこと
8
7
 
9
- ここに実現したいことを箇条書きで書いてください。
10
- - [ ] ▲▲機能動作するようにする
8
+ - [ ] パッケージ化されたストアドプロシージャ実行し、検索結果を取得したい
11
9
 
12
10
  ### 発生している問題・エラーメッセージ
13
11
 
14
12
  ```
13
+ ORA-06550: 行1、列30:
14
+ PLS-00201: 識別子NAME1を宣言してください。
15
- エラーメッセージ
15
+ ORA-06550: 行1、列7:
16
+ PL/SQL: Statement ignored
16
17
  ```
17
18
 
18
19
  ### 該当のソースコード
19
20
 
20
- ```ここに言語名を入力
21
+ ```PACKAGE定義
22
+ PACKAGE PKG1 AS
23
+ TYPE tNAME1 is TABLE of VARCHAR2(64) INDEX BY BINARY_INTEGER;
24
+ TYPE tNAME2 is TABLE of VARCHAR2(64) INDEX BY BINARY_INTEGER;
25
+
26
+ PROCEDURE proc1
27
+ (
28
+ in1 IN char,
29
+ NAME1 OUT tNAME1,
30
+ NAME2 OUT tNAME2
31
+ );
32
+
33
+ END PKG1;
34
+ ```
35
+
36
+ ``` PACKAGE BODY定義
37
+ PACKAGE BODY PKG1 AS
38
+ PROCEDURE proc1
39
+ (
40
+ in1 IN char,
41
+ NAME1 OUT tNAME1,
42
+ NAME2 OUT tNAME2
43
+ )
44
+ IS
45
+ (以降、処理本体)
46
+ ```
47
+
48
+ ```VB.NET
49
+ Dim objRS As New ADODB.RecordSet
50
+ Dim objParam As New ADODB.Parameter
51
+ Dim objCmd As New ADODB.Command
52
+ With objRS
53
+ .CursorType = ADODB.CursorTypeEnum.adOpenStatic
54
+ .LockType = ADODB.LockTypeEnum.adLockReadOnly
21
- ソースコード
55
+ End With
56
+
57
+ With objCmd
58
+ .let_ActiveConnection(conADO) ‘conADOはADODB.Connection型。事前に接続済み。
59
+ .CommandType = ADODB.CommandTypeEnum.adCmdText
60
+ objParam = .CreateParameter(“input”, ADODB.DataTypeEnum.adVarChar, ADODB.ParameterDirectionEnum.adParamInput, Len(strInput), strInput) ‘ strInputはstring型の引数
61
+ .Parameters.Append(objParam)
62
+ .CommandText = “{call PKG1.proc1(?,{resultset 1, NAME1, NAME2})}”
63
+ End With
64
+
65
+ objRS.Source = objCmd
66
+ objRS.Open() ‘ ここでエラー
67
+ ‘以降、objRS.Fields(“NAME1”).Value、objRS.Fields(“NAME2”).Valueを参照して処理
68
+
22
69
  ```
23
70
 
24
71
  ### 試したこと
25
72
 
73
+ CommandTextを変えた場合のエラーの変化を見ました。
74
+
75
+ .CommandText = “{call PKG1.proc1(?,{resultset 1, NAME1})}”
76
+ →エラーメッセージ変わらず
77
+
78
+ .CommandText = “{call PKG1.proc1(?,{resultset 1, NAME3})}”
26
- ここに問題に対して試したこと記載してください。
79
+ → PLS-00201: 識別子NAME3宣言してください。
80
+
81
+ .CommandText = “{call PKG1.proc1(?)}”
82
+ → PLS-00306: 引数の数または型が正しくありません。
83
+
27
84
 
28
85
  ### 補足情報(FW/ツールのバージョンなど)
29
- ここにより詳細な情報記載してください。
86
+ PKG1.proc1の処理本体は自スキーマのシノニム参照していますそのシノニムは他スキーマのテーブルを参照しています。
30
87
 
88
+ 前提として、「.CommandText = “{call PKG1.proc1(?,{resultset 1, NAME1, NAME2})}”」の文法的意味が不明なので理解したいです。
89
+ ・外側の波括弧はどういう働きをしているのか
90
+ ・内側の波括弧はどういう働きをしているのか
91
+ ・「resultset 1, NAME1, NAME2」とは何か