VBのイベントにてオラクルにログインし、SQLローダーを走らせたいのですが、どうすればよいでしょうか?
SQLローダはDOSコマンドでなきゃ動かないとなるとバッチ
を作っておくのですか?
バッチの作り方も良く分かりません。
宜しくお願いします

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

A 回答 (2件)

下記のようにすればOKです。


SQL.BAT の中身
sqlldr userid=uid/pw@moji CONTROL=TT.CTL LOG=TT.LOG DATA=C:\TT.TXT

TT.CTL の中身
LOAD DATA
TRUNCATE
INTO TABLE TT
FIELDS TERMINATED BY ','
( "KBN",


"ID" ,
"CODE"
)
    • good
    • 0

VBでDOSコマンドを実行するには、「SHELL」コマンドを使います。



例えば、こんな感じですね。

SHELL "COPY C:\*.* D:\"
(ちなみに、C:ドライブのルートにあるすべてのファイルをD:ドライブにコピーしています。)

ですから、SHELLコマンドを複数記述することによって、いちいちバッチファイルを書かなくても良くなりますね。
(もっとも、DOSプロンプトから同じような処理を行いたい場合には、バッチにしておいた方がいいですが…)

それから、VBにはODBC接続機能が装備されていますので、いちいちDOSコマンドを使わなくても、ODBC使って直接オラクルに接続するって手もありますよね。

不明点等、なんかありましたら補足をお願いします!
(とはいうものの、Oracleはあまり自信ないんですが(^^;)
    • good
    • 0

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

とは Oracle」に関するQ&A: Oracleとは?

ログイン Oracle」に関するQ&A: スキーマ

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

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

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

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

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

QSQL Loaderを使いたい

Oracleのバージョンは8、自分のPCには Oracle8Client(Application User) がインストールされています。

見よう見まねで制御ファイルを記述し、バッチファイルを作成したところ、
( sqlldr USERNAME/PASSWORD@SID control= test.ctl )

コマンドプロンプトには以下のように表示されました。

「C:\SQL>sqlldr USERNAME/PASSWORD@SID control = test.ctl
'sqlldr' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されていません。」

実行できない原因はどこにあるか教えてください。

1.そもそもSQL Loaderを利用できる環境になっていない
(そのままでは使えなくて何かしら設定が必要とか)

2.コマンドがまちがっている
(test.ctlのパスを記述しないとだめとか、SIDは要らないだとか)

3.制御ファイルがまちがっている

どの可能性が一番高いでしょうか?

Aベストアンサー

Oracle8Client(Application User)だと
SQL Loaderはインストールされないのではないでしょうか?
Clientのインストール時に選択肢があって、
管理者用(正確な名称は覚えていない)でインストールする必要があったと思います。

QSQLローダーを使ってExcelのデータをインポートする方法

Oracle9iで作成したテーブルに
Excel2002で作成したデータを
SQLローダーを使ってインポートするには
どのようにすれば良いのでしょうか?
バッチファイルを作ったりしなければ
ならない、というのは知っているのですが、
手順が分からないので、一連の操作の流れを
教えて頂ければ幸いです。

Aベストアンサー

>CSVファイルとコントロールファイルを作成し、
>sqlldrをコマンドプロンプトかSQL PLUSで
>流す、と言う事で良いのでしょうか?

SQL*Loader を実行するのは、コマンドプロンプト上です。

>また、コントロールファイルの作成は、
>エディタソフト(秀丸、wordpad等)で記述し、
>拡張子を変更すれば良いのでしょうか?

コントロールファイルは、通常お使いのエディタで記述して問題ありません。


あと、さきほどの例では、データの仕様については触れていないので、
NOT NULL などの制約がついている表だったりすると、変更しなければ
ならない場合があるので、注意したほうが良いです。

これ以上のことは、そちらの環境や表の構成、エクセルのデータを見てみないと
なんとも言えないので、後は自力で頑張ってもらうしかないですね。

QSQL*Loaderで、データを加工してロードしたいです。

SQL*Loaderを使ってデータをテーブルにロードしたいのですが、その際に、データを加工してロードしたいと考えております。

◎使用するコントロールファイルのサンプル
(項目1)(項目2)(項目3)
12345, abcde, ABCDE

◎使用するコントロールファイルのサンプル
Load Data
truncate
Into Table "Sample"
Fields terminated by ','
Optionally enclosed by '"'
(
 項目1,
 項目2,
 項目3,
 項目4 EXPRESSION ":項目1(の下1桁)|| ' ' || :項目2(の下2桁)|| ' ' || :項目3(の下3桁)"
)

まず、項目4には、項目1~3のデータを連結したものをロードしたいと考えております。
その際に、

項目4(6桁)="項目1の下1桁"+"項目2の下2桁"+"項目3の下3桁"

となるようにしたいのですが、どのような関数を使ったらよいのでしょうか?

また、連結する関数"EXPRESSION"とどのように組み合わせたらよいのか教えていただけないでしょうか?


思い当たる様々なキーワードでググってみたのですが、参考になるページを見つけることができませんでした。
「ヒントやるから自分で調べろ」みたいなお返事でも結構ですので、アドバイスをいただけますようお願い申し上げます。

SQL*Loaderを使ってデータをテーブルにロードしたいのですが、その際に、データを加工してロードしたいと考えております。

◎使用するコントロールファイルのサンプル
(項目1)(項目2)(項目3)
12345, abcde, ABCDE

◎使用するコントロールファイルのサンプル
Load Data
truncate
Into Table "Sample"
Fields terminated by ','
Optionally enclosed by '"'
(
 項目1,
 項目2,
 項目3,
 項目4 EXPRESSION ":項目1(の下1桁)|| ' ' || :項目2(の下2桁)|| ' ' || :項目3(の下3桁)"
)

まず、...続きを読む

Aベストアンサー

#1です。すいません、訂正です。

項目4 EXPRESSION "SUBSTR(:項目1,-1,1)|| ' ' || SUBSTR(:項目2,-1,2)|| ' ' || SUBSTR(:項目3,-1,3)"

QSQL*Loader Append

SQL*Loaderのコントロールファイル内のパラメータ設定についてですが、
ネットで調べた結果
ロード方法をAPPENDとすると既存データがある場合は新しい行として追加とあるのですが、
これはテーブルのPKが重複していても新しく行がついかされるということでしょうか?

逆にREPLACEはPKが重複しているデータに上書きされるということでしょうか?

よろしくお願いいたします。

Aベストアンサー

■APPENDで主キー重複が起きるか?
ダイレクトパスロードか否かで、結果が変わります。

LoaderのオプションがDIRECT = TRUE、かつダイレクトモード可能な条件を満たしている場合、ダイレクトパスロードとになります(素晴らしく速い)が、APPENDモードで主キー重複のレコードができてしまいます。

主キーが重複した場合、主キー制約/インデックスが無効状態になっており、INSERT/DELETE/主キーのUPDATEがエラーになってしまいますので、ご注意ください。
その場合は、TRUNCATE TABLEでいったんデータを消してしまえば、復活できます。

ダイレクトパスロードでない場合のAPPENDモードでは、主キー重複はエラーではじかれます。

■REPLACEの動き
PKが重複するものの入れ替えではなく、まるっと削除してからの追加になります。
TRUNCATEとの違いは、途中でエラーが発生したときにレコードが削除する前の状態に戻る点です。
レコードが消えて良いならTRUNCATEモードのほうが速いですね

QSQL*Loaderでのsysdate使用

SQL*Loaderを使用してデータロードする際に、「更新日時」項目にsysdateでシステム日付を返すようにしているのですが、更新日時がTIMSTAMP型の場合に時間まで設定されません。
時間まで設定するにはどのように指定したらよいでしょうか?よろしくお願いします。

Aベストアンサー

なるほどDATE型だと時分秒は入りますがTIMSTAMP型の場合は自動で入らないのですね。
下記のようにすれば大丈夫なようです。

HOGE_TEST1.sql
--
CREATE TABLE HOGE_TEST1
( KEY1 CHAR(10) NOT NULL,
DATE1 TIMESTAMP(6) NOT NULL
)
--

HOGE_TEST1.ctl
--
LOAD DATA
INFILE 'HOGE_TEST1.dat'
APPEND
INTO TABLE HOGE_TEST1
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
"KEY1",
"DATE1" DATE 'yyyy/MM/dd hh24:mi:ss' "to_char(SYSDATE,'yyyy/MM/dd hh24:mi:ss')"
)
--

HOGE_TEST1.dat
--
"AAAAA"
"BBBBB"
"CCCCC"
--

あとはsqlldrコマンドを発行
sqlldr USER/PASS control=HOGE_TEST1.ctl
試してみて下さい

なるほどDATE型だと時分秒は入りますがTIMSTAMP型の場合は自動で入らないのですね。
下記のようにすれば大丈夫なようです。

HOGE_TEST1.sql
--
CREATE TABLE HOGE_TEST1
( KEY1 CHAR(10) NOT NULL,
DATE1 TIMESTAMP(6) NOT NULL
)
--

HOGE_TEST1.ctl
--
LOAD DATA
INFILE 'HOGE_TEST1.dat'
APPEND
INTO TABLE HOGE_TEST1
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
"KEY1",
"DATE1" DATE 'yyyy/MM/dd hh24:mi:ss' "to_char(SYSDATE,'yyyy...続きを読む

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日付型のフィールドに空白を入れる方法を教えてください

ASP(VBScript)でSQLサーバにINSET INTO文を使ってデータを格納しているのですが、日付の部分がNULLの時、「1900/1/1」が入ってしまいます。
そのまま、空白を入れる方法はどうやったらよろしいのでしょうか?

TABLE1の内容は
番号|内容|日付です。

INSERT INTO TABLE1 VALUES ( 1, 'あいう', '')

結果
1|あいう|1900/1/1

Aベストアンサー

あとは、プログラムの書き方次第ですね、、、


If hensu=Null Or hensu="" Then
dt = "NULL"
Else
dt = "'" & hensu & "'"
End IF

E_SQL = "INSERT INTO TABLE1 VALUES & _
"( 1,'あいう', " & dt& ")"
の様に書きます。

Qbadファイルの内容を知る方法

Oracle9iでsqlldrを使い
csvファイルのインポートを
行ったのですが、インポートが
行えず、badファイルと言うものが出来ました。
この中にエラーの内容が記されているそうなのですが、
エラー内容が確認出来ませんので、
確認方法をご存知の方がいらしたら、書き込み願います。

ちなみにExcelで開くと、データとなるCSVファイルの
内容だけしか表示されません。
秀丸等のエディタで開くと文字化けします。

Aベストアンサー

こんちわ。

ちょっとうる覚えで申し訳ないのですが、
確か.badファイルは、エラーを起こしたデータが記載されているファイルだと思います。
どんなエラーを起こしたのかは、.logファイルを参照だったと記憶しています。
エラー的には型違い、区切り文字の欠如・間違い、データ個数の間違いが、
代表的なものになると思いますので、.badファイルのデータをSQL*PLUS、Accessなどで、直接データを放り込んでやると、よりエラーの特定がしやすくなるかと思います。

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

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。


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

人気Q&Aランキング

おすすめ情報