• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PLSQLについて)

PLSQLについて

このQ&Aのポイント
  • PLSQLについて時間がきたら動くようなバッチファイルを作成したいのですが、変数curA_recのデータ型はcurAのROWTYPEになります。
  • 質問1:dbms_outputの箇所を変更して抜き出したレコードをTAB区切りのtxt形式で出力する際の具体的なステートメントがわかりません。
  • 質問2:このファイルを任意のディレクトリにおいて時間がきたらファイルを実行するようにしたいのですがデータベース接続のためのConnect文を記述する箇所は一番上のset serveroutputの下に記述していいのでしょうか?

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

  • ベストアンサー
  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.3

> set Colsep を指定するときに''の中でTABを押すと出力されるファイルもTAB区切りになるのでしょうか? Yes > また、出力ファイルの最後に「~行選択されました。」の文字は消すことは出来ないのでしょうか? こちらをどうぞ。 http://oracle.se-free.com/utl/C1_csv.html

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

【質問1】 タブはchr(9)で表現できるので curA_rec.伝票番号||chr(9)||curA_rec.伝票日付||・・・ とすればいいのではないでしょうか。 【質問2】 set serveroutput on はDBに接続していないとできないですよね? この無名ブロックとは別のsqlファイルを用意し その中でconnectして、無名ブロックのsqlファイルを実行する、とすればいいのではないでしょうか。 No.1さんが示してくれた方法の方が簡単だとは思います。

全文を見る
すると、全ての回答が全文表示されます。
  • yorozu_ya
  • ベストアンサー率54% (76/140)
回答No.1
anman0201
質問者

お礼

ご回答ありがとうございます。 SPOOLを使って出力することができたのですが set Colsep を指定するときに''の中でTABを押すと出力されるファイルもTAB区切りになるのでしょうか? また、出力ファイルの最後に「~行選択されました。」の文字は消すことは出来ないのでしょうか? お手数ですが教えていただければ幸いです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PL/SQLで

    set serveroutput on size 100000; declare wk_cnt integer; begin wk_cnt := 100; for wk_cnt in 1..10 loop … end loop; dbms_output.put_line(wk_cnt); end; / で、最後のwk_cntが10(11?)ではなく100になります。 何故でしょうか??

  • ROWTYPEのINSERTが出来ません

    plsqlにてROWTYPEを使用したINSERTが出来ず困っています。 現在、以下のようなplsqlでROWTYPEのデータのINSERT処理をしようとしていますが、INSERTが出来ない状況となっています。 dbms_output.put_lineで確認するとINSERTしたいデータが存在していることは確認しています。 また、INSERT文をコメントアウトして実行すると、想定通りの回数のループ処理が 行われることも確認しています。 いまいち原因が分からず困っています。 DECLARE CURSOR zaiko_csr IS select * from zaiko_mst; zaiko_rec zaiko_mst%ROWTYPE; BEGIN OPEN zaiko_csr; LOOP FETCH zaiko_csr INTO zaiko_rec; EXIT WHEN zaiko_csr%NOTFOUND; insert into zaiko_bk(prd_cd, prd_nm, cnt) values(zaiko_rec.prd_cd, zaiko_rec.prd_nm, zaiko_rec.cnt); END LOOP; commit; close zaiko_csr; END;

  • Oracleでミリ秒の加算

    Oracleで秒以下の単位を含む加算の仕方を教えてください。 下記のサンプルでtargetTimeが0.5秒ずつ増えていくようにしたいのですがうまくいきません。 ちょっと書き方を変えればいいだけの事のような気がするのですが、いろいろ試したのですがうまくいきませんでした…。 よろしくお願いします。 SET SERVEROUTPUT ON FORMAT WRAPPED DECLARE targetTime TIMESTAMP(6) := TO_TIMESTAMP('2012/08/14 06:00:00', 'YYYY/MM/DD HH24:MI:SS'); vAddTime NUMBER(20, 10) := (1 / 86400) * 0.5; i integer := 0; BEGIN dbms_output.put_line('加算する値'); dbms_output.put_line(vAddTime); while (i < 10) loop dbms_output.put_line(targetTime); targetTime := targetTime + vAddTime; i := i + 1; end loop; END;

  • PL/SQLにてカーソル名を変数に

    PL/SQLにて、カーソル名を変数にしたいのですが、どうすればよいのでしょうか? 具体的には以下のとおりです。 DECLARE CURSOR Cur1 IS SELECT K1,K2 FROM EMP; BEGIN FOR Cur_Rec1 IN Cur1     Cur_Rec1.K1 DBMS_OUTPUT.PUT_LINE(Cur_Rec1.K1); ★ END LOOP; END; ★の部分の「Cur_Rec1.K1」を「Cur_Rec1.K2」として、置き換えて使用したいのです。(2回書きたくない) 初心者で、申し訳ないです。どうか、ご教授ください。

  • Function内に記述したdbms_output.put_lineの表示について

    Functionのテスト(デバッグ)にて、 dbms_output.put_lineを使用しております。 しかし、 SQL*Plusで「SET SERVEROUTPUT ON」を発行してから SELECT文を発行しても、 「dbms_output.put_line」で指定した値が表示されません。 ソースにはdbms_output.put_line文を入力しておりますし、 コンパイルも通っております。 SELECT文にてdbms_output.put_lineで指定した値を表示するには、 どのようにすればよいのでしょうか? なお環境は、 Oracle8iを使用しております。

  • 変数が選択リストにありません

    変数が選択リストにありません 下記のコードを実行すると「変数が選択リストにありません」というエラーが出てしまいます。 SELECT文とFETCHのINTOの変数の個数が一致していない場合にこのエラーは出るということらしいのですが、問題ないように思うのです。 下記コードで何が問題になっているのか教えてください。 よろしくお願いします。 set serveroutput on; declare -- 各テーブルの全カラムを取得 cursor curcol (p_tblname user_tables.table_name%type) is select COLUMN_NAME,DATA_TYPE from user_tab_columns where table_name = p_tblname ; v_sql varchar2(1000); -- SQL文 v_col varchar2(1000); -- カラム名 v_val varchar2(1000); -- 取得データ v_tblname varchar2(20); -- テーブル名 v_RstExec integer; v_CursorID integer; begin v_col := ''; v_tblname := 'sample'; -- 取得テーブルのカラムを取得 for rowcol in curcol(v_tblname) loop -- 取得カラムをCSV形式に変換 if v_col is null then v_col := rowcol.COLUMN_NAME; else v_col := v_col||'||'',''||'||rowcol.COLUMN_NAME; end if; end loop; dbms_output.put_line(v_col); -- SQL作成 v_sql := 'select '||v_col||' from '||v_tblname; v_CursorID := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(v_CursorID, v_sql, DBMS_SQL.NATIVE); v_RstExec := DBMS_SQL.EXECUTE(v_CursorID); LOOP IF DBMS_SQL.FETCH_ROWS(v_CursorID) = 0 THEN EXIT; END IF; DBMS_SQL.COLUMN_VALUE(v_CursorID, 1, v_val); DBMS_OUTPUT.PUT_LINE(v_val); END LOOP; DBMS_SQL.CLOSE_CURSOR(v_CursorID); end; /

  • カーソルループ内部でログを出力

    DECLARE CURSOR EMP_CUR IS SELECT SALARY FROM EMP WHERE DEPT_NO = 10 FOR UPDATE; BEGIN FOR EMP_REC IN EMP_CUR LOOP DBMS_OUTPUT.PUT_LINE( '変更前:' || EMP_REC.SALARY ); --SALARYが2500以下なら100を加える IF EMP_REC.SALARY < 2500 THEN UPDATE EMP SET SALARY = SALARY + 100 WHERE CURRENT OF EMP_CUR; DBMS_OUTPUT.PUT_LINE( '処理件数:' || SQL%ROWCOUNT ); END IF; DBMS_OUTPUT.PUT_LINE( '変更後:' || EMP_REC.SALARY ); END LOOP; END; / 上記のようなSQLで、 変更前のSALARYと変更後のSALARYを出力したいのですが、 変更前と変更後のEMP_REC.SALARYで、同じ値が出力されました。 処理の前後でSELECTする事は可能であると思いますが、 カーソル内でまとめて行いたいです。 カーソル内でIF文の前後の値を出力する事は可能でしょうか? また、もう1点質問があります。 それは、SALARYの値が、どちらも更新された値が出力される事についてです。 例:DEPT_IDが10で、SALARYが1000の従業員が居た場合。   変更前:1100   変更後:1100 EMP_REC.SALARYの値が、DECLAREで定義されたカーソルのデータならば、 1000が出力されると考えたのですが、 どちらも更新後の値が出力されるのは何故でしょうか? お手数をお掛け致しますが、よろしくお願い致します。

  • PLSQLで集計関数の値を配列に入れたい

    はじめまして。 各部門に所属している人の件数を配列に格納して処理したいと考えています。 (例)テーブル名:buhyo SQL:select bumon_cd,count(*) from buhyo group by bumon_cd order by bumon_cd 上記SQLの結果↓ 部門コード(bumon_cd)     count(*) --------------------------------- A11                   100 A12                   150 A13                   200 上の結果であるA11と100、A12と150、A13と200をそれぞれ配列に入れたくて PLSQLで以下のロジックを作成しましたが、うまくいかなくて困っています。 <ロジック> DECLARE CURSOR KEKKA IS SELECT BUMON_CD,BUMON_CD,COUNT(*) RCNT FROM BUHYO GROUP BY BUMON_CD ORDER BY BUMON_CD; TYPE BUMON_TAB IS TABLE OF KEKKA%ROWTYPE INDEX BY PLS_INTEGER; WK_ARRAY BUMON_TAB; BEGIN FOR WK_BUMON IN KEKKA LOOP I := I + 1; WK_ARRAY(I).BUMON_CD = WK_BUMON.BUMON_CD; WK_ARRAY(I).RCNT = WK_BUMON.RCNT; DBMS_OUTPUT.PUT_LINE(WK_ARRAY(I).BUMON_CD || ',' || WK_ARRAY(I).RCNT); END LOOP; END; / これで出力しようとしてもWK_ARRAY配列に部門コードと件数が入りません。 どのようにすれば各部門とその対になる件数を配列に入れることが 可能でしょうか?ご教授ください。 よろしくお願いします。

  • ストアド実行時のエラー「参照しているコレクションは初期化されていません」

    以下のようなパッケージを作っています。 CREATE OR REPLACE PACKAGE "TEST"."TEST_P" as type test_type1 is table of TEST.TEST_TABLE%ROWTYPE; procedure test2 (ret OUT test_type1 ) ; end; ----------------------------------- 本体 ----------------------------------- CREATE OR REPLACE PACKAGE BODY "TEST"."TEST_P" as procedure test2( ret OUT test_type1 ) is cursor basic_cusor is select * from TEST.TEST_TABLE; BEGIN open basic_cusor; loop fetch basic_cusor into ret(0); exit when basic_cusor%notfound; END loop; END TEST3; end; ---------------------------------------- これをSQL Pluseから set serveroutput on; declare  arg1 TEST.TEST_P.test_type1; begin TEST.TEST_P.test2(arg1); dbms_output.put(arg1(0).coulm1); end; のように実行するとエラーが出ます。 初期化処理とはどのように行えばいいのでしょうか? 最終的にはSQLServerのストアドようにテーブル のような構造で値を返えせればいいです。

  • pl/sqlでselect文の結果をCSV出力しようとしています。(o

    pl/sqlでselect文の結果をCSV出力しようとしています。(oracle 8.16) そこで以下のようにクエリの結果を出力しようとしているのですが、 SQL文の長さが255バイト(文字?)以下ならば正常に動くのですが、 255を超えると正常な結果が返ってこない状況です。 (エラーは発生しないが、結果が1カラム分しか出力されない。) OPEN c FOR SQL文; LOOP FETCH c INTO vOutputLine; EXIT WHEN c%NOTFOUND; DBMS_OUTPUT.PUT_LINE(SUBSTR(vOutputLine,1,100)); DBMS_OUTPUT.PUT_LINE(SUBSTR(vOutputLine,101,100)); DBMS_OUTPUT.PUT_LINE(SUBSTR(vOutputLine,201,100)); DBMS_OUTPUT.PUT_LINE(SUBSTR(vOutputLine,301,100)); DBMS_OUTPUT.PUT_LINE(SUBSTR(vOutputLine,401,100)); DBMS_OUTPUT.PUT_LINE(SUBSTR(vOutputLine,501,100)); END LOOP; CLOSE c; oracle8だとPUT_LINE などで使用できる一行のバッファサイズが 255 バイトまでという記事があったのでそれが原因かなとおもってのですが、解決方法が分かりません http://www.shift-the-oracle.com/plsql/dbms_output/ 解決方法、もしくは他に原因が検討違いでしたら教えていただけます様お願いします。

このQ&Aのポイント
  • iPrintをパソコンにダウンロードできないという問題が発生しています。
  • Windows 8.1を使用しており、iPrintのダウンロード方法がわからないため、助けが必要です。
  • EPSON社製品のiPrintをパソコンにダウンロードできない場合、教えていただける方がいらっしゃいましたら、お知らせください。よろしくお願いします。
回答を見る