お世話になります。

VBからストアドの動的SQLを呼んで、VB側で値をレコードセットで取得する方法を探しています。

■ストアド
CREATE OR REPLACE PACKAGE SAMPLE as

CURSOR c2 IS select A from TBL;
TYPE TANTOYOSANDATA IS REF CURSOR RETURN c2%ROWTYPE;

PROCEDURE GetNUMBER(C IN NUMBER,
          CU OUT TANTOYOSANDATA);
end;
/

--
CREATE OR REPLACE PACKAGE BODY SAMPLE IS

PROCEDURE GetNUMBER(C IN NUMBER,
            CU OUT TANTOYOSANDATA) IS

CUR INTEGER;
STATUS INTEGER;
ROW_PROCESSED INTEGER;
A NUMBER;

BEGIN
--カーソルをOPENする
CUR :=DBMS_SQL.OPEN_CURSOR;

DBMS_SQL.PARSE(CUR,'SELECT A FROM TBL ',DBMS_SQL.V7);

DBMS_SQL.DEFINE_COLUMN(CUR,1,A);

ROW_PROCESSED :=DBMS_SQL.EXECUTE(CUR);
STATUS :=DBMS_SQL.FETCH_ROWS(CUR);

WHILE (STATUS <> 0) LOOP
DBMS_SQL.COLUMN_VALUE(CUR,1,A);

STATUS :=DBMS_SQL.FETCH_ROWS(CUR);
END LOOP;

END;

END SAMPLE;
/

■VB側

Set GoORASESSION = CreateObject("OracleInProcServer.XOraSession")
Set GoORADATABASE = GoORASESSION.OpenDatabase(dbname, cnuser, ORADB_DEFAULT)

Set Recordset = GoORADATABASE.CreatePLSQLDynaset("Begin SAMPLE.GetTANTOINFO(1,:CU)); end;", "CU", ORADYN_DEFAULT)

' If Recordset.EOF Then
Do While Not Recordset.EOF
Label11.Caption = Recordset(0)
Recordset.movenext
 Loop


復帰値をRecordSetで受けて
それをまわしながら1レコードずつ取得する方法を探しています

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

DBMSはデバッグ用にしか使った事がないのですが・・・


カーソルを開いて、カーソルに返さないでもいいのでは?

ところでこのストアド、動的ではないような気が・・・
それにSQL文のみで実現するのでは?
それともこのストアドは、質問用のサンプルで、実際には動的なのですか?

もし質問の内容が正規なものなら無理にストアドを使用しないで
  Dim GoORASESSION  As Object
  Dim GoORADATABASE  As OraDatabase
  Dim Recordset    As OraDynaset
  Set GoORASESSION = CreateObject("OracleInProcServer.XOraSession")
  Set GoORADATABASE = GoORASESSION.OpenDatabase(dbname, cnuser, ORADB_DEFAULT)
  
  Set Recordset = GoORADATABASE.DbCreateDynaset("select A from tbl", ORADYN_DEFAULT)
  Do While Not Recordset.EOF
    Debug.Print Recordset.Fields(0).Value
    Recordset.MoveNext
  Loop
これじゃダメですか?

これがはずれで、どうしてもストアドを使用するなら、DBMSを使用しない書き方しかわからないのですが・・・
カーソルにA列の値だけセットしたいという意味ですよね?
    • good
    • 0
この回答へのお礼

ありがとうございました、動的SQLなのでカーソルが使えなかったので、一時表やPLSQL表で試して見ます

お礼日時:2001/11/21 11:19

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QMS-ACCESSで、レコードセットを取得したい。

MS-ACCESS2000での質問です。
VBAのコードで、任意のテーブルから、レコードセットを取得して、ADO.Recordset変数に代入したいのですが、どのような記述をすれば、出来ますでしょうか?
最終的にはそのレコードセットの各レコードに操作をしたいのです。
よろしくお願いします。

Aベストアンサー

Dim rstTable as ADODB.Recordset

Set rstTable = New ADODB.Recordset
rsTable.open "テーブル名", CurrentProject.Connection

ですが、以降の処理は多岐にわたりますので、
「技術評論社」の「Access2002 表現百科850」

http://www.amazon.co.jp/exec/obidos/ASIN/4774115681/qid=1127782111/sr=1-7/ref=sr_1_10_7/250-1523107-0995417

という本をお求めになって、学習することをお勧めします。

QIntegerからStringへの変換

お世話になっております。
簡単な事だと思うのですが教えて下さい。

Integerで宣言されている変数内の数値を
String文字に変換をしたいのです。

例)
123 → "000123"

のように頭に”0”を付けたいのですが
どの様にすればよいですか?

単純に CStr() では出来ないと思っているのですが・・

宜しくお願いします。

Aベストアンサー

Format(123, "000000")

で出来ると思います。試してみてください。

 後は、CStr()とRight$を組み合わせるとか...

QAccessコンボボックスにレコードセット代入について質問です。

Accessコンボボックスにレコードセット代入について質問です。

コンボボックスにレコードセットの値と代入したいと考えています。

Set Me![コンボボックス名].Recordset = rs

で代入できたのですが、連結列をどうしても代入できません。

| ID | MachineName |
| 1 | MachineA |
| 2 | MachineB |
| 3 | MachineC |

の様なレコードセットをコンボボックスに代入したいです。

保存列はIDフィールドです。
どなたかご存じの方がおられましたら、アドバイスよろしくお願いいたします。
m(_ _)m

Aベストアンサー

> 列数:2
> 列幅:0cm;3cm
> 連結列:1
2項目あるじゃないですか。
ID列の幅が0cmで、Excelでいう「列の非表示」と同じで見えないだけ。
列幅を 1cm;3cm  とでもしてみてください。(適宜調整)

DoLoopで代入しなくてもOKのはずですよ。

QMicrosoft Cursor Engineのバージョンを見るには

現在、VBでADOを使用し、コネクションでクライアント(Microsoft Cursor Engine)を設定しているプログラムがあります。

このプログラムを実行した際に、実行した環境で違うエラーが発生します。
片方のシステムエラーで「Microsoft Cursor Engine…」と出ているので、
おそらくMicrosoft Cursor Engineのバージョンか何かが違うのでは?と推察するのですが、どのファイルのバージョン(日付等)を確認すればよいのかが分かりません。
色々とネットでも調べてみましたが、調べ方が悪いようでなかなか知りたい情報にたどり着けません。

ユーザに説明が必要ですので、推測でものを言うわけにもいきませんので、このMicrosoft Cursor Engineのファイル及びそのバージョン等の確認方法をご存知の方は教えていただけますとありがたいです。

どうぞよろしくお願い致します。

Aベストアンサー

Google で「Microsoft Cursor Engine」を検索すると 2件目に出てきましたよ。(1件目はこの質問自体です)
http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=Microsoft+Cursor+Engine&num=50

で、
http://www.microsoft.com/japan/msdn/data/download/mdac/27/readmerefresh.asp
にバージョンが書いてありますが、Cursor Engine 単体の話じゃなくて、MDAC のバージョンが違ってるって事じゃないでしょうかね。
最新の MDAC を全てのクライアントにインストールしてみてはどうでしょうか?

QAccess2000のADOのレコードセットに先頭一致SQLを指定できない

お世話になっています。
さて、住所録があって、その住所の先頭と一致するレコードをSQLで抽出してその結果をレコードセットに代入したいのですが。
SQLは
"SELECT 住所録.住所 FROM 住所録 WHERE 住所録.住所 Like '" & str住所検索 & "*';"
というような感じです。(もうちょっといろいろあるけど)

それで、
rst.Open strSQL, CurrentProject.Connection, adOpenStatic, adLockReadOnly, adCmdText
rstはADOのレコードセットで、strSQLには上記のSQL文が代入されています。str住所検索には、検索したい住所の一部が代入されています。
これを実行すると、レコードセットにレコードが抽出されません。
WHERE句を
住所録.住所 = '" & str住所検索 & "';"
と完全一致にすると抽出します。
しかし、全部の住所が一致するレコードを集めたいわけではないので、これでは困ります。
ちなみに、クエリーで実行するとちゃんと集まります。
なんとか、レコードセットにあいまい検索の抽出結果を代入できないでしょうか?
ADOのレコードセットにはLike演算子は使えないのでしょうか?
よろしくお願いいたします。

お世話になっています。
さて、住所録があって、その住所の先頭と一致するレコードをSQLで抽出してその結果をレコードセットに代入したいのですが。
SQLは
"SELECT 住所録.住所 FROM 住所録 WHERE 住所録.住所 Like '" & str住所検索 & "*';"
というような感じです。(もうちょっといろいろあるけど)

それで、
rst.Open strSQL, CurrentProject.Connection, adOpenStatic, adLockReadOnly, adCmdText
rstはADOのレコードセットで、strSQLには上記のSQL文が代入されています。str住所検索には、検索した...続きを読む

Aベストアンサー

ワイルドカードを * では無く % を指定してみてください。

QEXCEL_VBAでOracleにADO接続してSQL文で追加/更新したい

EXCELで入力した値をADO接続して
SQL文で登録したいのですが 誰かサンプルソース
作成していただけないでしょうか?

Aベストアンサー

手抜きのような気もしますが…
Oracle OLACLEDBデータベースのSCOTTスキーマに「テスト」テーブルがある物とします。
NAME VARCHAR2
KOE VARCHAR2

Excelでは、ツール-参照設定で"Microsoft ActiveX Data Objects 2.0 Library"を参照します。

Module1を作成して、
↓ここから
Option Explicit

' ADOのオブジェクト変数を宣言
Private cnn As New ADODB.Connection
Private cmd As New ADODB.Command

Private Sub sTest()
On Error GoTo err_hdr
' Oracleの接続
cnn.Open "Provider=MSDAORA;" & _
"Data Source=ORACLEDB;", "SCOTT", "TIGER"
Set cmd.ActiveConnection = cnn
'追加の例
With cmd
.CommandText = "INSERT INTO テスト" _
& " (NAME , KOE)" _
& " VALUES ( '" & "ねこ" & "'" _
& " , '" & "にゃん" & "')"
.CommandType = adCmdUnknown
.Execute
End With
'更新の例
With cmd
.CommandText = "UPDATE テスト" _
& " SET テスト.NAME='" & "ねこ" & "'" _
& " , テスト.KOE='" & "にゃお~ん" & "'" _
& " WHERE " _
& " テスト.NAME='" & "ねこ" & "'" _
& " AND テスト.KOE='" & "にゃん" & "'"
.CommandType = adCmdUnknown
.Execute
End With
'削除の例
With cmd
.CommandText = "DELETE FROM テスト" _
& " WHERE " _
& " テスト.NAME='" & "ねこ" & "'" _
& " AND テスト.KOE='" & "にゃお~ん" & "'"
.CommandType = adCmdUnknown
.Execute
End With

cnn.Close

Set cmd = Nothing
Set cnn = Nothing
Exit Sub
err_hdr:
Resume Next
End Sub
↑ここまで

「ねこ」とかの代わりにExcelシート上のセルからデータを取得して
セットするように改造下さればなんとかなるかと思います。

手抜きのような気もしますが…
Oracle OLACLEDBデータベースのSCOTTスキーマに「テスト」テーブルがある物とします。
NAME VARCHAR2
KOE VARCHAR2

Excelでは、ツール-参照設定で"Microsoft ActiveX Data Objects 2.0 Library"を参照します。

Module1を作成して、
↓ここから
Option Explicit

' ADOのオブジェクト変数を宣言
Private cnn As New ADODB.Connection
Private cmd As New ADODB.Command

Private Sub sTest()
On Error GoTo err_hdr
' Oracleの接続
cnn.Open "Provider=M...続きを読む

QAccess クエリ このレコードセットは・・・

いつもお世話になります。

Accessで下記の様にクエリを作成しましたが、”このレコードセットは更新できません”と出てしまいます。

■テーブル1
 ・顧客ID(主キー)
 ・顧客名
 ・住所
 ・TEL

■テーブル2
 ・顧客ID
 ・取引ID(主キー)
 ・請求金額

■クエリ1(集計クエリ)
 ・顧客ID グループ
 ・請求金額合計: Sum(請求金額) 合計

■クエリ2(実際に使用するクエリ)
 ・顧客ID(テーブル1)
 ・顧客名(テーブル1)
 ・住所(テーブル1)
 ・TEL(テーブル1)
 ・請求金額合計(クエリ1)

このクエリ2を開いて更新しようとしても、”このレコードセットは更新できません”と左下に表示されて更新できません。

・請求金額合計(クエリ1)を除けば問題なく更新できます。

ですが1顧客に対して通算で幾ら請求をしたかとその顧客のデータを同一クエリで表示・更新したいので、意味をなさなくなってしまいます。

どなかた良い方法をご教授下さいませ。

Aベストアンサー

> 1顧客に対して通算で幾ら請求をしたかとその顧客のデータを
> 同一クエリで表示・更新したい

「『請求合計金額』は参照のみ、それ以外は更新可」ということ
でしたら、『請求合計金額』を、「定義域集計関数を使用した
演算フィールド」としてしまう、というのはいかがでしょうか。
これであれば、クエリ1を使用する場合に比べ、動作が遅くは
なりますが、テーブル1の各フィールドの編集は可能になります。

■クエリ2
 ※使用するのはテーブル1のみ、クエリ1は使用せず※
 ・顧客ID(テーブル1)
 ・顧客名(テーブル1)
 ・住所(テーブル1)
 ・TEL(テーブル1)
 ・請求金額合計(以下の式を指定)
  『フィールド:』欄:DSum("請求金額", "テーブル2", "[顧客ID]=" & [顧客ID])
  『テーブル:』欄: (空白にします)

注意:
万が一、顧客IDのデータ型が数値型ではなくテキスト型だった場合は、
以下の式としてください:
  『フィールド:』欄:DSum("[請求金額]", "テーブル2", "[顧客ID]='" & [顧客ID] & "'")

上記の「DSum」などの「定義域集計関数」の詳細については、
Accessのヘルプを参照してください。

なお、同関数の第3引数については、以下の過去のQ&Aを
参考として挙げておきます(No.4):
http://oshiete.goo.ne.jp/qa/6442713.html

> 1顧客に対して通算で幾ら請求をしたかとその顧客のデータを
> 同一クエリで表示・更新したい

「『請求合計金額』は参照のみ、それ以外は更新可」ということ
でしたら、『請求合計金額』を、「定義域集計関数を使用した
演算フィールド」としてしまう、というのはいかがでしょうか。
これであれば、クエリ1を使用する場合に比べ、動作が遅くは
なりますが、テーブル1の各フィールドの編集は可能になります。

■クエリ2
 ※使用するのはテーブル1のみ、クエリ1は使用せず※
 ・顧客ID(テーブル1)
 ・顧客名...続きを読む

Qプロシージャの引数の取り得る値がIntegerとDouble、両方ある

プロシージャの引数の取り得る値がIntegerとDouble、両方ある場合、

プロシージャの引数の型を、どう宣言しておけば良いのでしょうか。
型によって条件分岐し、それぞれの型に適したプロシージャを作り分けておくなんてことはないですよね?苦笑

If VarType(var) = vbInteger then
  Call FuncInteger(VarInt)
ElseIf VarType(var) = vbDouble then
  Call FuncDouble(VarDbl)
End If

FuncInteger(VarInt)と、FuncDouble(VarDbl)は、
引数の型が違うだけで、内容は同じ。

初歩的な質問で恐縮ですが、何卒宜しくお願い致します。

Aベストアンサー

>プロシージャの引数の取り得る値がIntegerとDouble、両方ある場合、
基本的には、一番、大きなデータ型(Double型やLong型)のデータ型で引数をあてます。

数値判定をして、
>  Call FuncDouble(VarDbl)

で送ります。

関数プロシージャやサブ・プロシージャの場合は、FuncDouble(ByVal arg As Double) とします。
あえてデータ型を変数に含めるなら、dblVar という書き方がよいでしょう。

Excel VBAでは、対ワークシート用で、本格的に作る場合は、Variant 型で受けるように作りますが、セルの値は、数字の場合と文字とエラーですから、プログラム内で分岐して、Double 型かLong型で扱います。場合によっては、Currency 型にしますが、Integer 型での扱いはしません。中級レベルぐらいまでは、そのような面倒なコードでは長くなりますし、プライベートで使うことが多いので、最初から決め打ちしてしまいますので、Variant型にするようなことはないはずです。分かっていてVariant 型にするのと、分からずにVariant 型にするのでは、雲泥の差があります。

一連の質問の様子からすると、今は、あまり細かいことにこだわらないほうが良いような気がします。

>プロシージャの引数の取り得る値がIntegerとDouble、両方ある場合、
基本的には、一番、大きなデータ型(Double型やLong型)のデータ型で引数をあてます。

数値判定をして、
>  Call FuncDouble(VarDbl)

で送ります。

関数プロシージャやサブ・プロシージャの場合は、FuncDouble(ByVal arg As Double) とします。
あえてデータ型を変数に含めるなら、dblVar という書き方がよいでしょう。

Excel VBAでは、対ワークシート用で、本格的に作る場合は、Variant 型で受けるように作りますが、セルの値は、数字の...続きを読む

QACCESS レコードセット

非連結フォーム(frm_B)のOPEN時にADOレコードセットでデータを表示させ、更新ボタンを押すと、追加クエリでそのフォーム上で表示されたデータをテーブル(tbl_B)に新規登録させ、さらにその非連結フォームには別のフォームの内容を表示させるVBAを書きましたが、最後に別のフォームの内容で非連結フォームにデータをセットしたとき?にテーブルのデータも更新されてしまいます。最初にテーブルに追加したデータとは切り離したいのですがどうすればうまくいくのでしょうか。
・フォームfrm_BをOPEN
'DAOレコードセット
Dim dbDAO As DAO.Database
Dim rsDAO As DAO.Recordset
Dim stSQL As String

stSQL = "SELECT No.,規格No.,改訂No. FROM tbl_B " _
& "WHERE 規格No. ='" & Forms![frm_A].[規格No.] & "'" _
& "AND 改訂No. =" & Forms![frm_A].[改訂No.] & ""

'DAOレコードセット
Set dbDAO = CurrentDb
Set rsDAO = dbDAO.OpenRecordset(stSQL)
Set Me.Recordset = rsDAO

Me![No.].ControlSource = "No."
Me![規格No.].ControlSource = "規格No."
Me![改訂No.].ControlSource = "改訂No."

'DAOレコードセットクローズ
Set rsDAO = Nothing
Set dbDAO = Nothing

・更新ボタンクリック
Private Sub cb_kaitei_Click()
Dim stDocName As String

  '追加クエリ
stDocName = "q_B"
DoCmd.OpenQuery stDocName, acNormal, acEdit
Forms![frm_B].SetFocus
Me![No.] = Forms![frm_A].[No.]
Me![規格No.] = Forms![frm_A].[規格No.]
Me![改訂No.] = Forms![frm_A].[改訂No.]

このときにレコードセットで追加したレコードのほうも更新されてしまいます。これを別のレコードと判断させたいのです。よろしくお願いします。

非連結フォーム(frm_B)のOPEN時にADOレコードセットでデータを表示させ、更新ボタンを押すと、追加クエリでそのフォーム上で表示されたデータをテーブル(tbl_B)に新規登録させ、さらにその非連結フォームには別のフォームの内容を表示させるVBAを書きましたが、最後に別のフォームの内容で非連結フォームにデータをセットしたとき?にテーブルのデータも更新されてしまいます。最初にテーブルに追加したデータとは切り離したいのですがどうすればうまくいくのでしょうか。
・フォームfrm_BをOPEN
'DAOレコー...続きを読む

Aベストアンサー

No.1です。

補足欄について。
そもそも、なぜフォームを非連結にしているのでしょうか?
いちいちフォームAの条件で絞った結果をフォームBのレコードソースにせずに、フィルタをかければいいのでは?
そして、連結しておいて、追加処理を、

DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70

で行えばいいのでは?
その後で、新規レコードに移動して、フォームBの各コントロールに、フォームAの値をセットすればいいと思います。
セットしただけでは、まだ更新されていないので、ここで上記のコードを再び実行すれば、新規データとして登録されます。

QVB で =Right([nendo],2) & "/06" はどういう事ですか?Right([nendo],2)は?

VB で =Right([nendo],2) & "/06" はどういう事ですか?Right([nendo],2)は?

Aベストアンサー

&amp;="&"
&amp;="""
=Right([nendo],2) &amp; &quot;/06&quot  -> =Right([nendo],2) & "/06"
[nendo]はアクセスのフィールド名か(アクセスのVBA?)。[]で囲むから。
中身は、#2でご指摘の年度で2007とかは行っているのでしょう。
Right関数は文字列の右側、最後から文字数を指定して切り出す。
&は文字列を結合する演算子。
/06をこの順序で結合するもの。


人気Q&Aランキング

おすすめ情報