プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。

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レコードずつ取得する方法を探しています

よろしくお願いします。

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が見つからない時は、教えて!gooで質問しましょう!