ストアドプロシージャ結果のファイル出力について

このQ&Aのポイント
  • Oracleのストアドプロシージャを使用して、DBMS_OUTPUTの結果をファイル出力する方法について教えてください。
  • AccessからOracleのストアドプロシージャを呼び出している際に、DBMS_OUTPUTの結果をファイルに出力したいです。UTL_FILEを使用する以外に方法はありますか?
  • Access2003からOracleのストアドプロシージャを呼び出して、ファイルに出力する方法を教えてください。
回答を見る
  • ベストアンサー

ストアドプロシージャ結果のファイル出力について

お世話になります。 以下のようにOracleにてストアドプロシージャを作成して、 それをAccessからコールしております。 そしてそのDBMS_OUTPUTの結果をファイル出力したいのですが、 試しに「sqlstmt = "BEGIN proc_SeikyuMeisai(:yyyymm); END;"」の部分を 「sqlstmt = "spool aaa.csv BEGIN proc_SeikyuMeisai(:yyyymm); END; spool off"」 や、ストアド側でspoolしてみましたがダメでした。 UTL_FILEを使うしかないのでしょうか? ご存じの方おられたらご教示いただけますでしょうか? 宜しくお願い致します。 【Access2003側】 ' セッションの作成 Set OraSession = CreateObject("OracleInProcServer.XOraSession") 'データベースへの接続 Set OraDatabase = OraSession.OpenDatabase("Hoge", "hoge/hoge", ORADB_DEFAULT) '■ ストアド実行 ■ sqlstmt = "BEGIN proc_SeikyuMeisai(:yyyymm); END;" 'バインド変数の設定 OraDatabase.Parameters.Add "yyyymm", 0, ORAPARM_INPUT OraDatabase.Parameters("yyyymm").serverType = ORATYPE_NUMBER '引数設定 OraDatabase.Parameters("yyyymm").value = Forms!F月次データ取込.txt日付1 'SQL文の実行 OraDatabase.ExecuteSQL sqlstmt DoCmd.Hourglass False '砂時計 'バインド変数の削除 OraDatabase.Parameters.Remove "yyyymm" '■ORACLEへの切断■ OraDatabase.Close 'オブジェクトの破棄 Set OraDatabase = Nothing Set OraSession = Nothing MsgBox "正常に出力されました。" 【Oracle10g】 Create or replace procedure Proc_SeikyuMeisai ( P1_YYYYMM IN number ) IS WK_KANID varchar2(10); WK_CODE varchar2(6); WK_SUU varchar2(12); WK_TEN varchar2(9); WK_KAI varchar2(2); -- カーソルタイプの定義 TYPE typeMyCursor IS REF CURSOR; -- カーソル変数の定義 curSeikyu typeMyCursor; curID varchar2(10); curMAX number; curMEISAI varchar2(1000); curTEN number; curKAI number; vSql varchar2(1000); BEGIN vSql := 'select KANNO, MEISAI_MAX, _MEISAI, HOU_TENSUU_KEI, TOTAL_KAISUU from SEIKYUUMEISAI' || P1_YYYYMM; -- カーソルオープン open curSeikyu for vSql; loop fetch curSeikyu into curID, curMAX, curMEISAI, curTEN, curKAI; exit when curSeikyu%NOTFOUND; WK_KANID := curID; for nLpCnt IN 1..curMAX loop WK_CODE := substrb(curMEISAI, 3, 6); WK_SUU := substrb(curMEISAI, 34, 12); WK_TEN := substrb(curMEISAI, 89, 9); WK_KAI := lpad(curKAI, 2, 0); dbms_output.put_line(WK_KANID || ',' || WK_CODE || ',' || WK_SUU || ',' || WK_TEN || ',' || WK_KAI); end loop; end loop; end; /

  • Oracle
  • 回答数3
  • ありがとう数0

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

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.1

SPOOLは、SQL*Plusの命令なので SQL*Plusを使わずに実行している >Accessからコール のときは使えません。 >UTL_FILEを使うしかないのでしょうか? その通り、UTL_FILEを使ってください。

その他の回答 (2)

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.3

#2 のmuyoshid です。 済みません。 訂正します。 #1 の方がおっしゃられている通り、Stored Procedure の中でファイル 出力させたい場合は、UTL_FILE パッケージを使用する必要があります。 DBMS_OUTPUT は単に画面に出力するだけで、spool はSQL*Plus の機能です。

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.2

こんにちわ。 > UTL_FILEを使うしかないのでしょうか? loop に入る前に、dbms_output.enable(NULL) を実行してみて下さい。 詳細は、PL/SQL のパッケージリファレンスをどうぞ

関連するQ&A

  • .NETからストアドプロシージャを実行

    VB.Netからストアドプロシージャを実行するプログラムの書き方がよく分かりません。 データベースはOracleです。 PROCEDURE test(aaa IN number, bbb IN varvhar2, ccc IN OUT varchar2); といったPL/SQLをVB.NET上で実行するとします。 (略:データベースへの接続処理) strSql = "begin test(10, 'テスト', '');end;" 結果「式が割り当てられていません」とエラーが出ます。 すべての引数がINのプロシージャでは、上記の方法で実行できたので、IN OUTへの引数の渡し方に問題があると思うのですが、どうしても分かりません。 まだ使い始めたばかりで、どうしていいかまったく分からない状態です。 どうかご指導お願い致します。

  • ストアドプロシージャの実行について

    asp.net から sqlserver のストアドプロシージャを実行させる勉強をしています。 作成されているはずのストアドプロシージャを実行できずに困っています。 webformにテキストボックス、ボタン、データグリッドを貼り付け、ストアドプロシージャを作成し下記のプログラムを実行させるのですが上手くいきません。 (テキストボックスに任意で入力された数値のデータをボタンを押すと表示するものです) <エラー内容>→ ストアド プロシージャ 'proc1' が見つかりませんでした Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim cn As New SqlConnection Dim cmd As New SqlCommand cn.ConnectionString = "接続文字列" cmd.Connection = cn cmd.CommandText = "proc1" cmd.CommandType = System.Data.CommandType.StoredProcedure Dim p1 As SqlParameter = cmd.Parameters.Add("@param1", System.Data.SqlDbType.Int) p1.Value = TextBox1.Text cn.Open() Dim dr As SqlDataReader = cmd.ExecuteReader DataGrid2.DataSource = dr DataGrid2.DataBind() dr.Close() cn.Close() end sub ストアドproc1(場所:Northwind)の内容↓ CREATE procedure proc1 @param1 int as select * from products where categoryID=@param1 どなたか原因のわかる方がいれば、宜しくお願いします。

  • 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

  • ストアドについて質問

    質問をご覧いただきまして有難うございます。 初めてストアドプロシージャを作成しており、サンプルでいろいろと作ってみようと思い、作成コードを実行しようとしたんですが、以下のようなメッセージが表示され、正常に実行できません。 ORA-00001: 一意制約(OES4.PK_SITT_IKO_LOG)に反しています ORA-06512: "OES2.PRA002",行16 ORA-06512: 行4 以下はストアドです。 CREATE OR REPLACE PROCEDURE PRACTICE001 IS BEGIN DECLARE --ループ CNT NUMBER; BEGIN CNT := 0; LOOP EXIT WHEN CNT >= 10; CNT := CNT + 1; insert into LOG_TBL values(systimestamp,'test','comments are...'); END LOOP; END; END; テーブル(LOG_TBL)定義は次のようになっています。 LOG_TIME timestamp NOT NULL COMMENT1 varchar2(20) COMMENT2 varchar2(200) タイムスタンプであれば重複もないと思うんですが。。。 原因がよくわからないです。。。 宜しくお願い致します!

  • MySQL5.0のストアドプロシージャで引数の使い方がわからなくて困っています。

    MySQL5.0のストアドプロシージャで引数の使い方がわからなくて困っています。 ストアドプロシージャで IF文で引数の空の判定と、 LIKE '%name%'にその引数を使いたいのです。 どなたかわかるかたいらっしゃいませんか? □プログラムからコールする strSQL = "CALL buttonaction_proc2(syohinCd, syohinCdLast, name, count) "; □ストアドプロージャ delimiter // CREATE PROCEDURE buttonaction_proc2(IN syohinCd INT(8), IN syohinCdLast INT(8), IN name VARCHAR(40), IN count INT(8)) IF ((syihinCd IS NOT NULL) OR (syohinCdLast IS NOT NULL) OR (name IS NOT NULL)) THEN AND (SYOHIN_CD BETWEEN syohinCd AND syohinCdLast) ELSE (IF syohinCd IS NOT NULL) THEN AND (SYOHIN_CD BETWEEN syohinCd AND count) ELSE IF (syohinCdLast IS NOT NULL) THEN ( AND (SYOHIN_CD BETWEEN 1 AND syohinCdLast) ) IF (name IS NOT NULL) THEN AND NAME LIKE '%name%' END IF END IF ORDER BY SYOHIN_CD; END //

  • phpMyAdminからストアドプロシージャを

    phpMyAdminからストアドプロシージャを作成したいのですが、エラーが表示され作成できません。 DELIMITER // CREATE PROCEDURE proc1(INT pa char(10)) BEGIN update sum_table set blank = pa; END; // DELIMITER ; これを実行したところ以下のエラーが出ました。 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INT pa char(10)) BEGIN update sum_table set blank = pa; END' at line 1 -------------------------------------------------------------------------------- そこでソースから「DELIMITER」を消してもう一度実行してみました。 CREATE PROCEDURE proc1(INT pa char(10)) BEGIN update sum_table set blank = pa; END; すると今度は以下のエラーが表示されました。 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INT pa char(10)) BEGIN update sum_table set blank = pa' at line 1 どこが間違っているかわからず困っております。 初歩的な質問で凝縮ですが、どなたかご教示いただけますでしょうか?

  • PerlからOracleのストアドを呼びたいのですが、パラメータに配列は使えますか?

    Perl(5.005_03) からOracle(8i)のストアドを呼びたいのですが、パラメータに配列は使えますか? 使えるのなら、以下のようなストアドをPerl側から呼ぶには、どうすればよいでしょうか? ---------------------------------------------------------------------- /* 配列型 */ CREATE OR REPLACE PACKAGE text_util IS   TYPE vc_arr IS TABLE OF VARCHAR2(10)   INDEX BY BINARY_INTEGER; END; / /* 呼びたいストアド */ CREATE OR REPLACE PROCEDURE TEST_PROC ( v_DATA in text_util.vc_arr, i_IDX in INTEGER ) IS END; / ---------------------------------------------------------------------- よろしくお願いします。 【環境】sun4-solaris, apache

  • ExcelVBA+OO4O使ったストアドのカーソルの扱い

    お世話になります Dim Cellsvalue(1,1) As Variant Cellsvalue(0,0) = 1: Cellsvalue(1,0) = 1 Cellsvalue(0,1) = 2: Cellsvalue(1,2) = 2 With UsroOraDB   .Parameters.Add "PARA1", Cellsvalue, ORAPARM_INPUT .Parameters("PARA1").serverType = ORATYPE_CURSOR   .BeginTrans   .ExecuteSQL("BEGIN TestPack.TestProc(":PARA1"); END;")   .CommitTrans End With 以上のように、引数としてカーソルを渡したいのですがOracleストアドでは値をひろっていませんでした。 引数の渡し方がまずいと思うのですが、この場合は二次元配列ではだめなのでしょうか? よろしくおねがいします

  • ストアドプロシージャーでループするとエラー

    ストアドプロシージャーを空の行をつくるために、ループさせようとしていますが、エラーがでます。 #1313 - RETURN is only allowed in a FUNCTION 書いたソースです。 delimiter | CREATE PROCEDURE looptest(OUT param1 INT) begin declare cnt int default 0; declare result varchar(255) default seed; lbl : loop set cnt =cnt +1; if cnt >= param1 then leave lbl; else INSERT INTO `wp_base_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES (NULL, '0', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '', '', 'draft', 'open', 'open', '', '', '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0', '', '0', 'page', '', '0'); end if; end loop lbl; return result; END | delimiter; call looptest; #1313 - RETURN is only allowed in a FUNCTION

  • SQL Server 2000でのストアド

    現在,データベースの勉強中ですが,下記の内容で困っています。 ●SQL SERVER 2000のストアド CREATE PROCEDURE Strd_Test ( @aaa varchar(10), @bbb varchar(10), @rowcount int output, @msg varchar(100) output ) AS set nocount on begin select aaa,bbb from T_test where aaa=@aaa and bbb=@bbb end; select @rowcount=@@rowcount, @msg='検索に成功しました'; return GO ●Excel2003のVBA Private Sub btn1_Click() Set dbCN = New ADODB.Connection dbCN.Open "Provider=SQLOLEDB;" _ & "Data Source=*****,9999;" _ & "Initial Catalog=DB_Test;" _ & "User ID=sa;Password=" Set dbCOM = New ADODB.Command dbCOM.ActiveConnection = dbCN dbCOM.CommandType = adCmdStoredProc dbCOM.CommandText = "Strd_Test" dbCOM.Parameters.Refresh dbCOM.Parameters("@aaa") = "100" dbCOM.Parameters("@bbb") = "あいうえお" (1) ストアドの実行 (2) MsgBox "検索結果:" & dbCOM.Parameters("@rowcount").Value _ & vbCrLf & dbCOM.Parameters("@msg").Value (3) WorkSheets("Sheet1").Cells(1, 1).CopyFromRecordset dbRS dbRS.Close Set dbRS = Nothing Set dbCOM = Nothing End Sub ●こんな感じで,検索結果のレコードセットと, アウトプットパラメータの両方を取得したいのですが ExcelのVBAから,(1)のところで,   ・「dbCOM.Execute」とした場合には,    (2)でアウトプットパラメータが正常に返ってきます    (3)は,当然エラーです   ・「Set dbRS = dbCOM.Execute」とした場合には,    (2)でアウトプットパラメータが2つとも空です    (3)は正常にレコードセットを取得できます こうなってしまうのですが,レコードセットと アウトプットパラメータの両方を取得するためには, どこを修正すれば良いのでしょうか? どなたか,お力を貸してください。