oo4oのexecuteSQLでupdate実行後の実行件数を取得方法は?

このQ&Aのポイント
  • oo4oを使用してオラクルDBに接続し、executeSQLメソッドによりupdate処理を実行した場合、実行結果の件数を知りたい場合はどうすれば良いかについて教えてください。
  • Javaの場合は戻り値として実行結果の件数が返ってくるため簡単ですが、oo4oのexecuteSQLメソッドではどのように実行結果の件数を取得するのか分からないです。
  • また、where句に当てはまるレコードが無い場合でも処理が成功としてエラーが出ないため、実行結果の件数を取得する方法が必要です。
回答を見る
  • ベストアンサー

oo4o。executeSQLにてupdate実行後、実行件数取得は?

今まであまり使ったことの無かったAccess97のVBAを使用しています。単純な質問なんですが、教えてください。 oo4oにてオラクルDBに接続し、executeSQLメソッドにより単純なupdate処理を実行しました。 -----(細かいところは省略) sql= "update TABLE_A set CODE='AAA' where NAME='HOGE'" OraDB.ExecuteSQL sql ----- このExecuteSQLメソッドの、実行結果が0件なのか、1件なのかを知りたいのですが、方法はありますでしょうか?つまり、直前のSQLの実行結果を取得するメソッドはありますか?という質問です。Javaとかなら、戻り値として実行結果の件数が帰ってきますよね。この場合はそれをどうやって取ればいいのでしょうか? where NAME='HOGE'に当てはまるレコードが無くても、0件の処理が成功として、エラーは出ないんですよねぇ・・・ もし不足の情報がありましたら、補足いたします。 よろしくお願いします。

  • dd44
  • お礼率94% (395/419)

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>result = OraDB.ExecuteSQL sql '☆1 括弧がありませんねぇ(^^; result = OraDB.ExecuteSQL(sql)

dd44
質問者

お礼

ええー。それですか? 「result = 」が無ければカッコ無しでも通るんですよ。。?

dd44
質問者

補足

ビンゴでした。かっこつけたらちゃんと動きました。ありがとう御座います。 ・・・っていうか、なにこの言語・・

その他の回答 (3)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>実行すると「構文エラー」・・・ うーん、構文エラーって納得いきませんねぇ。 どんなコードかいてますか?

dd44
質問者

お礼

ホント、単純なコードなんですが、以下抜粋です。 ---- Dim OraSession As Object Dim OraDB As Object Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set OraDB = OraSession.DbOpenDatabase(DB_TNSNAME, DB_USERNAME & "/" & DB_PASS, 0&) Dim result As Integer Dim sql As String sql = "update ~(省略) " OraSession.BeginTrans result = OraDB.ExecuteSQL sql '☆1 OraSession.CommitTrans ---- この☆1の部分の「result = 」を消すとうまく行くんですが、これがあると、エディタの時点で赤くなってしまっています。。resultの型が間違っているのかと色々試したんですが、ダメでした。☆1の行の「result = 」を消し、その次の行に「result= OraDB.GetRowsProcessed」を入れても、「オブジェクトは、このプロパティまたはメソッドをサポートしていません」と出てしまいます。。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>うーん,IntegerでもLongでも試してみたんですけど、コードエディタの時点で赤くなってしまって、実行すると「構文エラー」・・・ もしかして、タイプライブラリを参照設定していますか? oo4o、タイプライブラリ使うとたまに変な動きをしたような・・・

dd44
質問者

お礼

タイプライブラリの参照設定はしてありました。 一応外して試してみたんですが、どの方法でも結局おなじエラーになってしまいますね。。 それにしてもAccessの参照設定ってなんでこんなに分かりにくいんだろう…なにがなんだか。。 ありがとう御座いました。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

ExecuteSQLメソッドの戻り値

dd44
質問者

お礼

あは、そのまんまですかw Integerの変数に戻り値を入れようとしたらエラーになったんで、てっきり戻り値が無いのかと思ってました。型が違うだけで、早とちりしていたということですね;;試してみます。ありがとうございました。

dd44
質問者

補足

うーん,IntegerでもLongでも試してみたんですけど、コードエディタの時点で赤くなってしまって、実行すると「構文エラー」・・・ OraDBに対して、GetRowsProcessedというメソッドも試してみたのですが、まったく同じで、サポートされていないということでした。 これはoo4oのバージョン(8.1.5.3.4)なども関係してくるのでしょうかね・・? ネットで探すと、実行結果の件数が戻り値として戻ってくるという話もあり(→×)、GetRowsProcessedで件数が取れるという話もあり(→×)、またoo4oのヘルプでは「操作の正常な終了(OSUCCESS)または失敗(OFAILURE)を示すoresultを戻します。」とあるので、これでは件数は取れないです。。 もし何かアドバイスありましたらどなたか引き続きよろしくお願いします・・。

関連するQ&A

  • VB6 + OO4O プロシージャの実行&複数行を受け取る方法

    VB6 + OO4O プロシージャの実行&複数行を受け取る方法 現在、VB6でOracleデータベースを操作しようと試みている最中で、 OO4Oで接続しています。 (表現誤っているかもしれません。。。) Oracleは今回初めてで、今まではSQLserverだったのですが、 SQLserverで、  1.ストアドを実行(パラメータあり)  2.レコードセット(複数行)を受け取る  3.ループで全件処理   ・・・ というような処理をしていました。 たとえば、あるテーブルの、ある条件に一致したレコード(複数あり)を全件取得 など。 「引数を渡してストアドプロシージャを実行し、複数行を結果として受け取る」ということがしたく、 Oracleでどのように実現させるかを調べてみたのですが、 「SQL文を記述し、受け取る」  例)strSQL = "select * from tbl"    Set OraDynaset = OraDatabase.CreateDynaset(strSQL, 0) というようなサンプルしか見つけられませんでした。 where句で条件を記述すれば同じなのかもしれませんが、 そういったこまごました記述をストアドプロシージャに記載しておき、 呼び出す際はパラメータだけ指定する、ということを想定しています。 ストアドを実行するサンプルは複数見つけたのですが、戻り値が1つのみか、戻り値なしのもので、 複数行を結果として受け取るようなサンプルが見あたりませんでした。 ストアド(PL/SQL)も作成してみたのですが、 単純に  select * from TBL; とするとエラーで、  select * BULK COLLECT INTO vTBl from TBL;  for i in 1 .. vTBl.count loop   -- 全レコードの項目「name」を表示する。   dbms_output.put_line(vTBl(i).name);  end loop; というように1件1件処理させていく方法しか見つけれませんでした。 Oracleのストアドは、今までのSQLServerの考え方はいけないのでしょうか? 調べるとしたら、どのような単語で調べたらよろしいでしょうか? 「VB6」「oo4o」「複数行」「プロシージャ」など、いろいろ努力はしたつもりなのですが。。。 ご指導よろしくお願いいたします。

  • oo4oのリファレンスが見たいのですが・・。

    初歩的な質問かもしれませんが・・。 oo4o(Oracle Objects for OLE)のリファレンスを 読みたいのですが、何を見ればいいのでしょう? MSDN?オラクルのマニュアル? どちらも見てみたのですが、みつかりませんでした。 探し方が悪いのでしょうか? 簡単なリファレンスなら手元にあるのですが・・。 「このメソッドの引数はSQL命令&オプションで・・」 というところで記述が止まっていて、「オプションには どんな値が指定できるのか」まで突っ込んだ資料がなく て困っている状態です。 よろしくお願いいたします。

  • oo4o CreateDynasetによるデータ取得

    こんばんわ。知っている方がいたら教えて下さい。 今、VB6.0&ORACLE9iで開発を行っています。 oo4o接続で、CreateDynasetを使用し、下記のようなSQL文を投げています。ただし、取得するレコードは0件になります。 SELECT SUM(項目a) FROM テーブルA WHERE 条件1 GROUP BY を使用せず、SUMを使用すると、oraDynaset.EOFがFALSEとなり、OraDynaset.RecordCountは1件となります。 (当然、SQLはSQL PLUSにて流して件数なしの確認済みです) これってなんでなのでしょうか?

  • VBAでoo4oを使用してINSERTする際にエラーが発生

    Excelのマクロでoo4oを使用してINSERTをしようとしています。 Dim OraSession As OraSession Dim OraDatabase As OraDatabase Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set OraDatabase = OraSession.OpenDatabase(TNS, USER/PASS, 0&) OraSession.BeginTrans OraDatabase.ExecuteSQL("Insert Into tablename ( colum1, colum2) VALUES( '12345', '1234');") OraSession.BeginTrans OraDatabase.ExecuteSQLでINSERTしようとした場合に、「ORA-00911: 文字が無効です。」とエラーになってしまいます。 同じSQL文をSQL PLUS+で実行させた場合、正常にINSERTができます。 何か特別な処理をしないといけないのでしょうか。 よろしくお願いします。

  • ストアド内で実行したSQLの出力結果について

    現在、引数の値を元に下記のようなSQL文を生成しています。 SELECT code, name FROM T_CGY WHERE code = '1111' UNION SELECT code, name FROM T_CGY WHERE code = '1110' UNION SELECT code, name FROM T_CGY WHERE code = '1100' UNION SELECT code, name FROM T_CGY WHERE code = '1000' ORDER BY code; ※出力されたSQL文に誤りがないかを確認する為にコピーしてターミナル上で実行したら該当するレコードを取得する事ができました。 それをストアドプロシージャ内で生成したSQL文を「QUERY EXECUTE」を実行して該当するレコードが取得できるように改造してみました。 下記が出力された結果です。 getCgyData -------------------- (1000,洋服) (1100,子供服) (1110,ズボン) (1111,長ズボン) 出力されたデータは私が望んだ内容なんですが・・・ 私的には下記のように出力したいと考えています。 col1    | col2 ------------------------- 1000  | 洋服 1100  | 子供服 1110  | ズボン 1111  | 長ズボン 何とか上記のように出力できるようにするにはどうしたらいいでしょうしょうか。 そもそも上記のように出力する事は可能なのでしょうか。 CREATE FUNCTION getCgyData (VARCHAR) RETURNS TABLE(col1 VARCHAR, col2 VARCHAR) AS ' DECLARE key ALIAS FOR $1; sql TEXT; BEGIN                 ・                 ・ ※ここでSQL文を生成して、変数(sql)に格納しています。                 ・                 ・ RETURN QUERY EXECUTE sql; END; ' language 'plpgsql' ; データベースのバージョンはpostgreSQL8.4.9です。 再度、申し訳ありませんがアドバイス、宜しくお願いします。 では、失礼します。

  • UPDATEを同時に実行する

    UPDATE文について質問なんですが、 下記のクエリのように条件の違うものを一度に実行させるということは可能なのでしょうか? UPDATE テーブル名 SET No = '2' WHERE No = '3' ・・・(1) UPDATE テーブル名 SET No = '3' WHERE No = '2' ・・・(2) (1)を実行し(2)を実行すると、期待通りの結果がどうしても得られません。 どなたかわかる方がいらっしゃれば、よろしくお願いしますm(__)m

  • SQLServerのクエリ速度の違いについて

    Webアプリケーション(ASP.NET)より、SQLServer2005に対してデータを取得しています。 その際にSELECT句のSQL文を実行しているのですが、以下のパターンによって処理速度が異なります。 ■ パターン(1) SQLCommandクラスに対して、SQL文、パラメータを渡し実行. 処理時間 = 1分程度. [SQL文] SELECT * FROM T_TEST WHERE code = @code; [ソース] Dim sqlCom As New SqlCommand(strSql, con) sqlCom.Parameters.add(New SqlParameter("@code", SqlDbType.Int)).Value = 100 …略 ■ パターン(2) 以下のSQL文をSQLCommandクラスに渡して実行. 処理時間 = 15秒程度. [SQL文] DECALRE @code As Int; SET @code = 100; SELECT * FROM T_TEST WHERE code = @code; [ソース] Dim sqlCom As New SqlCommand(strSql, con) …略 システム自体はパターン(1)の形で共通のメソッドを作成しています。 処理が遅かったのでSQLをSSMSにて解析しようとして、パターン(2)の様に変数定義をDECLAREで記述した所、速くなり、 実際のシステム上で試した所、同じような速度となりました。 パターン(1)の様な形ではパターン(2)の様な速度はやはり出ないのでしょうか? ちなみにProfilerでパターン(1)のSQL文を見たら、"EXEC sp_executesql N'SELECT ~"が実行されていました。 以上、どなたか分かる方ご教授ください。

  • SQLとDAOで取得するレコード件数が違う?

    Access2007でSQLで実行した結果と、レコードセットで取得した件数が一致せずに困っています。 いろいろ調べてはみたのですが、なぜかわかりません。 よろしくお願いします。 ○TableA 型 Code1 数値型(主キー) Text テキスト型 Code2 数値型 ○TableA データ Code1 Text Code2 111 AAA 10 112 BBB 15 113 CCC 20 114 DDD 20 ○VBAコード Dim strSQL As String Dim db As DAO.Database Dim rstFind As DAO.Recordset strSQL = "SELECT * FROM TableA Where Code2 = 20" Set db = CurrentDb() Set rstFind = db.OpenRecordset(strSQL, dbOpenSnapshot) MsgBox rstFind.RecordCount この状態でSQLビューから実行すると2件が抽出され、上記VBAを実行するとMsgBoxには「1」と表示されます。

  • エクセルからアクセスの更新クエリをVBAで実行することは可能ですか?

    SQL = "UPDATE ~WHERE ;" DoCmd.RunSQL SQL をエクセルのコマンドボタンから実行させたいのですが どのような処理が必要でしょうか? よろしくお願いします。

  • oo4oを使ったOracleへのデータ処理を高速化したい

    タブ区切りのtsvファイルの1項目目に並んでいるデータをDBのプライマリーキーとみなして、DB上に既にあればupdate、なければinsertします。 下のPGは、DBに30万件のデータが入った状態で実行すると、遅すぎて使えません。もっと速くすることはできませんでしょうか。 Public Const OraSQL_01 = "INSERT INTO CUSTOMER (COMPANY_CODE, TEST1) Values (:データ0, :データ1)" Public Const OraSQL_02 = "UPDATE CUSTOMER SET COMPANY_CODE = :データ0, TEST1 = :データ1 WHERE COMPANY_CODE = :データ0" wkFile1 = "c:\test\test.csv" Open wkFile1 For Input As #1 OraSession.BeginTrans Set rs = OraDatabase.CreateDynaset("SELECT COMPANY_CODE FROM CUSTOMER", ORADYN_DEFAULT) OraDatabase.Parameters.Add "データ0", 0, ORAPARM_INPUT OraDatabase.Parameters("データ0").ServerType = ORATYPE_NUMBER OraDatabase.Parameters.Add "データ1", 0, ORAPARM_INPUT OraDatabase.Parameters("データ1").ServerType = ORATYPE_VARCHAR2 Do Until EOF(1) Line Input #1, Text sec = Split(Text, vbTab) OraDatabase.Parameters("データ0").Value = sec(0) OraDatabase.Parameters("データ1").Value = sec(1) Dim flg As Boolean Do Until rs.EOF flg = False If rs("COMPANY_CODE") = sec(0) Then OraDatabase.ExecuteSQL OraSQL_02 flg = True Exit Do Else rs.MoveNext End If Loop If flg = False Then OraDatabase.ExecuteSQL OraSQL_01 End If rs.MoveFirst Loop OraSession.CommitTrans

専門家に質問してみよう