人気マンガがだれでも無料♪電子コミック読み放題!!

oracle10gを使用しています。

sqlplusでいくつかのDDLとDMLを一度にコピーペーストで流しました。一つ一つの処理後にcommit;も入っています。
しかし、最後のDMLで処理がとまってしまい、エラーもでません。内容は以下のようになっています。

insert into tbl_a
(select distinct col1,'2006/01/01'
from tbl_b
where col1 is not null
union
select distinct col2,'2006/01/01'
from tbl_b
where col2 is not null
union
select distinct col3,'2006/01/01'
from tbl_b
where col3 is not null
union
select distinct col4,'2006/01/01'
from tbl_b
where col4 is not null
union
select distinct col5,'2006/01/01'
from tbl_b
where col5 is not null
union
select distinct col6,'2006/01/01'
from tbl_b
where col6 is not null);
COMMIT;

この処理を単独で実行すると、成功します。sqlpulsは、実行コマンドの量に制限などあるのでしょうか?なぜ、このようになるかわかりません。ちなみに、コマンドの全文字数は3990目で、処理が停止するのは、3648文字目です。この3648文字目にあたるのが、上記の
>select distinct col3,'2006/01/01'

>select disti
です。
大変急を要ししています。
よろしくお願いします。

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

A 回答 (5件)

改行を省いてもエラーとなる文字数は3648文字目なのでしょうか。


それとも、『>select disti』なのでしょうか。
3648文字なら、文字数オーバーって事ですよね。
『>select disti』なら、Insert句に問題があるという事だと思います。

ただ、今後の事を考えると#1さんのおっしゃるようにストアド化した方が良いと思います。
(Unionで結合しているので、その部分を注意しないといけませんが)


どのテーブルを見れば、ロールバック領域が一杯かは私も知りません。(すみません)
ですが、ロールバックが一杯かそうでないかは、SQL文を少し修正して動かすと分かると思います。
tbl_bテーブルの各項目がNOT NULLの場合に処理対象としていますよね。
各SELECTの結果が一件しか出力されないような条件を追加してはどうでしょう。
そうすると、Insert句全体がおかしいかどうか分かると思います。

がんばってください。
    • good
    • 0
この回答へのお礼

本当に本当に、ありがとうございます。
調べてみましたところ、文字数オーバーでした。オラクル10gからは、文字数制限が3000文字から若干増えているということがわかりました。

いろいろご助言いただき、本当に感謝しております。
ありがとうございました。

お礼日時:2006/02/01 23:54

Windows のクリップボードにはたくさんコピーできるのに、それを sqlplusw.exe に貼り付けると途中までしか貼り付かないみたいです。

数行ずつに分けて貼り付けるとか…。あと、コマンドプロンプトの sqlplus.exe は、いくらでも貼り付けられるみたいです。
    • good
    • 0

@で、そのファイルを読んだらどうかしら?


sqlplusw.exe の代わりに sqlplus.exe を使ってみたらどうかしら?

この回答への補足

>@で、そのファイルを読んだらどうかしら?

ファイルを読むと成功しました。
といううことは、やはり、sqlplusの文字数制限のために、処理が停止したと考えることが妥当ということでしょうか?

補足日時:2006/01/30 08:53
    • good
    • 0

見たところ、各テーブルより値を取得して、Insertを行っているのですよね。



もしかしたら、RollBack セグメントが一杯になっているのではないでしょうか。

この回答への補足

追加質問させてください。
RollBack セグメントが一杯が一杯かどうか調べるためには、どのようにすればよいのでしょうか?

調べたところ、V$ROLLSTATにRSSIZEという項目がありますが、これと何かを比較するのでしょうか?また、どこかにログ等出力されているのであれば、それを確認したいのですが、無理でしょうか?

補足日時:2006/01/27 10:11
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
大至急調べてみます。

お礼日時:2006/01/26 22:19

参考URLによると、コマンドラインの文字数は3000文字が限界のようです。


コマンドは余分な空白などは詰められるようなので、実際の文字数は3000文字を超えると思いますが。

コピペではなくストアドプロシージャにすることをお勧めします。

http://biz.rivus.jp/sqlplus_limits.html

参考URL:http://biz.rivus.jp/sqlplus_limits.html
    • good
    • 0
この回答へのお礼

コマンドラインに制限があるかと思い、改行やコメント等を省きましたが、以前原因不明です。空白および、改行も影響してるのかもしれません。

ストアドプロシージャという手がありましたか。。。本日、急遽引き継いで、テストをしていたので最終的に動かない場合は、全編集でストアドプロシージャを作成する方向に持っていかなければならないかもしれません。。。
回答ありがとうございました。

お礼日時:2006/01/26 22:26

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

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

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

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

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

Qbatファイルからsql文実行

クライアントOS:WIN2000
Oracle:9i(サーバ(UNIX)上にあります)

現在、クライアントからbatを起動し、SQL文を投げ、結果を取得したいと思っております。
(SQL文は単純にTBLをカウントしているだけです)

・batの中身
sqlplus %UID%/%PASS%@%SID% @test.sql > output

結果は取得出来るのですが、余分な情報も結果に出力されてしまいます。結果のみを出力させるにはどうすればよろしいでしょうか?

・余分な情報
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
に接続されました。

Aベストアンサー

sqlplus に -S オプションを追加してみればどうでしょうか。

参考URL:http://biz.rivus.jp/sqlplus_overview.html

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。

QPL/SQLで@ファイル名が反応しません

はじめまして、PC超初心者なのにOracleを勉強し始めました。
PL/SQLの本を買って見よう見真似でやっているのですが、SQL*PLUSから@<ファイル名>を実行しても何の反応もありません。

SQL>@sample1

としても

SQL>@sample1
SQL>

と何事もなかったようになります。

本によればエディタに保存したSQL内容が実行されるとあるのですが。。。
ちなみにサンプルエディタをダウンロードして、実行しようとしても全くの無反応です。

どこか根本的な設定がおかしいのでしょうか。。。
どなたかご回答いただけると助かります。

Aベストアンサー

sample1というファイルはどこのフォルダにありますか?
ファイル名にフォルダ名をつけたフルパスで実行してみてください。
たとえばc:\hogeというフォルダにsample1.sqlファイルがあるのであれば
SQL>@c:\hoge\sample.sql
で実行されます。

コマンドプロンプト版のsqlplusだとsqlplusを実行したフォルダにファイルがあるとフォルダ名を省略したファイル名で実行できます。
画面のsqlplusは・・・どこだったか忘れた(^^;

#なんか過去にもこんな質問があったような・・・

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

QPL/SQLをWindowsのBATファイルで実行するには

いつも参考にさせていただいております。
表題のとおり、WindowsServer2003上でBATファイルを起動したいのですが、うまくいきません。

BATファイルの中身
sqlplus USER_A/USER_A @DB_A @SQLPAT
sqlplus USER_B/USER_B @DB_B @SQLPAT

SQLPATファイルは、大体以下の感じで、2つのスキーマーで同じPL/SQLを実行します。

Declare

カーソルループ
更新


END;

タスクにBATファイルを登録し実行すると
最初のPL/SQLは実行されますが、次のUSER_Bが実行されません。

どなたか詳しい方ご教授をお願いできませんでしょうか?
オラクルのVerは9iです。よろしくお願い致します。

Aベストアンサー

pl_sqlは予めDBに登録しておく。
CREATE OR REPLACE PROCEDURE pl_hoge()
IS
・・・
BEGIN
・・・
END;
/

■hoge.bat
sqlplus user/pass@dbname @hoge.sql

■hoge.sql
SET serveroutput ON;
BEGIN
pl_hoge();
END;
/
exit;

1さんはhoge.sql最後のexit;を指摘してます。
私もそれと疑いますが。

Qバッチファイルを使用したsql@plusの実行及びログ出力について

バッチファイルを使用したsql@plusの実行及びログ出力について

Windows Server 2003上で動作しているOracle10gのDBに対して
Windows XP上に配置したバッチファイルをタスクで起動させ、
sql@plusを使用してデータを削除する処理を行いたいと考えています。

---data_delete.bat---
@echo %date% %time% データ削除開始 >> log.txt
sqlplus -S USER/PASS@TNSNAME @data_delete.sql >> log.txt
@echo %date% %time% データ削除終了 >> log.txt

---data_delete.sql---
DELETE FROM TABLE WHERE FLG = 1;
EXIT;

data_delete.batを実行するとlog.txtが出力されます。
---log.txt---
yyyy/mm/dd hh:nn:ss.xx データ削除開始

XXX行が削除されました。

yyyy/mm/dd hh:nn:ss.xx データ削除終了

この時、log.txtの内容を下記のように変更したいのですが、
その方法が分りません。

---log.txt---
yyyy/mm/dd hh:nn:ss.xx データ削除開始
yyyy/mm/dd hh:nn:ss.xx データ削除終了 XXX行が削除されました。

できれば[削除件数 XXX 件]と表示させたかったのですが、
自分の調べた限りではできそうにないので、
フィードバックされる文字列をそのまま使う方向で進めています。

上記ログの出力方法ができるようでしたら、
その方法を教えて頂けると嬉しいです。

宜しくお願いします。

バッチファイルを使用したsql@plusの実行及びログ出力について

Windows Server 2003上で動作しているOracle10gのDBに対して
Windows XP上に配置したバッチファイルをタスクで起動させ、
sql@plusを使用してデータを削除する処理を行いたいと考えています。

---data_delete.bat---
@echo %date% %time% データ削除開始 >> log.txt
sqlplus -S USER/PASS@TNSNAME @data_delete.sql >> log.txt
@echo %date% %time% データ削除終了 >> log.txt

---data_delete.sql---
DELETE FROM TABLE WHERE FLG = 1;
EXIT;

dat...続きを読む

Aベストアンサー

batのリダイレクト>>を使わず、SQL*Plus(@ではなく*です)のspoolを使ってはいかがでしょう?

set NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS'
sqlplus -S USER/PASS@TNSNAME @data_delete.sql

data_delete.sqlの中身
--------------------------
whenever sqlerror exit failer
set echo off
spool log.txt
select sysdate||' データ削除開始'
delete from table where flg = 1;
select sysdate||' データ削除終了'
--------------------------

ご希望のように
yyyy/mm/dd hh:nn:ss.xx データ削除開始
yyyy/mm/dd hh:nn:ss.xx データ削除終了 XXX行が削除されました。
とするためにはちょっとSQLだけではできないのでPL/SQLを使う必要があります。

batのリダイレクト>>を使わず、SQL*Plus(@ではなく*です)のspoolを使ってはいかがでしょう?

set NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS'
sqlplus -S USER/PASS@TNSNAME @data_delete.sql

data_delete.sqlの中身
--------------------------
whenever sqlerror exit failer
set echo off
spool log.txt
select sysdate||' データ削除開始'
delete from table where flg = 1;
select sysdate||' データ削除終了'
--------------------------

ご希望のように
yyyy/mm/dd hh:nn:ss.xx データ削除開始
yyyy/mm/...続きを読む

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

QSYSユーザーでログインしたい

SQL plusでSYSユーザーでログインするにはどうすればよいのでしょうか?
SYSTEMユーザーやSCOTTユーザーではログインできるのですが、SYSユーザーになる方法がわかりません。
お願いします。

Aベストアンサー

>SQL plusでSYSユーザーでログインするにはどうすればよいのでしょうか?
特別なことする必要がないと思います。
ログインできない場合いろいろな原因が考えられます。
一番可能な原因は設定によってSYSユーザーNOMAL権限でログインできない場合あります。
この場合
sqlplus sys/パスワード@接続文字列 as sysdba
で試してください。


>SYSTEMユーザーやSCOTTユーザーではログインできるのですが、SYSユーザーになる方法がわかりません。
conn sys/パスワード@接続文字列 as sysdba

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。

QOracleで「文字が無効です」のエラーが出ます

Oracleで「文字が無効です」のエラーが出ます

JavaからOracleに接続して、SELECT文を発行していますが、何度試しても上記のエラーが出ます。
発行しているSELECT文を、SQLPlusから打ち込むとちゃんと実行できます。
何が悪いのか見当がつきません。
お知恵をお貸しください。
ちなみに、対象テーブルの項目はvarchar2とnumberだけの項目ばかりで、日本語は使ってません。
また、Oracle初心者です。

環境
端末:WindowsXP
Oracle:10g Express Edition ※文字コードはAL32UTF8
IDE:Eclipse3.5 ※設定-一般-ワークスペースのテキストファイルエンコードはUTF-8

Aベストアンサー

Java内で生成したSQL文を見ないとなんとも言えないけど。

Javaでリテラル吐き出して編集してますかね?
select UserID, UserName from mstUser where UserID = '001'; みたいな。
条件によって 001 の部分を変化させるような。


だったらJavaでシングルクォートを吐き出すところを二重にしてみるとどうかな?
ダブルクォートでは無いよ。二重に書くことでシングルクォート一個と解釈されればOKのはず。

そうしておかないとSQL文全体を文字列で扱うんだろうから、シングルクォートの対応が崩れる。

つくりとしては以下のように作成。
select UserID, UserName from mstUser where UserID = ''001''; みたいな。

SQL文を文字列変数に格納するんだろうから
'select UserID, UserName from mstUser where UserID = ''001'';'


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング