CLOBのテーブル項目に10K以上のテキストデータをASPから登録したいのですが
普通にINSERT文で、テキストデータをシングルクォーテーションで囲むとエラーになります。どうしたらいいのでしょうか?

A 回答 (1件)

オラクルの問題ではなく、処理言語系の問題ではないでしょうか?



十分な大きさの変数を宣言して、それに代入してみて正常に動きますか?

またはいっぺんに代入せずに複数回に分けて連結していく、ではどうでしょう?
(「|(パイプ記号)」で連結できたと思います)
    • good
    • 0

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

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

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

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

QCLOBの容量確認

 CLOBに入力されたデータを分割して表示する必要がありまして、
「何バイト」入っているか知りたいのですが、どのようにしたらよいでしょうか?
全角文字、半角文字が混在するデータのため、どうしてよいかわからない状態になっています。
「何文字」入っているかは、DBMS_LOB.GETLENGTHで調べればよいのは
わかっているのですが・・。

Aベストアンサー

実際に環境がここにないので正しいかわからないですが、
文字数を出す際は、length。
文字バイト数を出す際は、lengthb。
を使用します。CLOBでもサポートされていると思います。
--------------------------------------------------
例)
SELECT LENGTHB('CANDIDE') "Length in bytes" FROM DUAL;
--------------------------------------------------

分割と言う意味ですと、
バイト単位ではsubstrb関数を使用するのが良いと思います。
--------------------------------------------------
例)
SELECT SUBSTRB('ABCDEFG',3,2) "Substring with bytes" FROM DUAL;
--------------------------------------------------

実際に環境がここにないので正しいかわからないですが、
文字数を出す際は、length。
文字バイト数を出す際は、lengthb。
を使用します。CLOBでもサポートされていると思います。
--------------------------------------------------
例)
SELECT LENGTHB('CANDIDE') "Length in bytes" FROM DUAL;
--------------------------------------------------

分割と言う意味ですと、
バイト単位ではsubstrb関数を使用するのが良いと思います。
--------------------------------------------------
例)
...続きを読む

Qoracleで別のグローバルデータベースのテーブルからPL/SQLでデータをinsertする方法。

こんにちは。

別の場所に設置してあるoracleのデータベースからinsert文でデータを引っ張って来れないかと思っています。

ご存知の方いらっしゃれば宜しくお願い致します。

内容:
ここのoracleです。
グローバルデータベース名:testa.ok.com
(データベース名:testa)
スキーマ名:output
テーブル名:名称マスタ
項目内容:番号、名前
ユーザ名:tosi
password:tosi

あっちのoracleです。
グローバルデータベース名:testb.ok.com
(データベース名:testb)
スキーマ名:input
テーブル名:名称マスタ
項目内容:番号、名前
ユーザ名:tosi
password:tosi

PL/SQLで出来ないものでしょうか?
宜しくお願い致します。

Aベストアンサー

こんにちわ。

データベースリンクを使用すれば可能です。
まず、あっちのデータベース (testb.ok.com) に接続
するための接続文字列をtnsnames.ora に定義します。
→ sqlplus tosi/tosi@接続文字列 でtestb.ok.com
  に接続できる事を確認して下さい。

次にtesta.ok.com 側にデータベースリンクを作成します。
Create database link DBリンク名
 connect tosi identified by tosi using '接続文字列';
→ select ~ from input.名称マスタ@DBリンク名
  where ~
 で、データベースリンク経由でデータにアクセスできること
 を確認して下さい。

後は、SQL 文 (PL/SQL でも可) の中で
Insert into 名称マスタ select * from
 input.名称マスタ@DBリンク名 where ~;
とすれば、Ok です。

QBLOBやCLOBのパフォーマンスを改善したい

Oracle 10g R2 を使用し、開発を行っていますが、
パフォーマンス改善という壁にぶつかっており、
お助けいただきたいと思いました。

要求定義の段階で、可変長のバイナリデータを扱う必要があり、
テーブル内には BLOB フィールドを用意しております。
レコード件数にすると、全体でおおよそ 500,000 ~ 1,000,000 件に
なります。(導入先によって上記範囲内で変動する)
データはさらに区分によって判別されるようになっております。

プログラムから投入する SQL 文については、
最適化を行っておりまして、最高のパフォーマンスが得られる
であろう構文になっておりますし、テーブルの設計についても、
検索条件となる項目へのインデックス設定を行っています。

現状としてプログラムの中でボトルネックとなっているのは、
BLOB データを Fetch するタイミングなんです。
開発環境は、C#.NET+ODP.NET なんですけど、ミドルウェアは、
oo4o を使った場合でも、Microsoft の Oracle のドライバを
使用したときでも同じ部分でボトルネックになっていました。
ちなみに、BLOB をやめて、CLOB にした場合も、
CLOB データを Fetch する部分がボトルネックになっていました。

テスト段階なのでバイナリデータが 4 KB 未満ですが、
これを VARCHAR2(4000) のフィールドに Base64文字列などで
格納した場合は、LOB データの Fetch はありませんので、
かなり高速な処理が実現できるのですが、実際の運用では、
4 KB を超えるようなバイナリデータが普通に現れてきます。
なので、VARCHAR2 でのデータベース設計ができない状態です。

そもそも、この BLOB フィールドや CLOB フィールドのデータを
Fetch する速度を向上させること、というのは可能なのでしょうか?
ちなみに、Oracle サーバ側の設定は一切行っておりません。

Oracle 10g R2 を使用し、開発を行っていますが、
パフォーマンス改善という壁にぶつかっており、
お助けいただきたいと思いました。

要求定義の段階で、可変長のバイナリデータを扱う必要があり、
テーブル内には BLOB フィールドを用意しております。
レコード件数にすると、全体でおおよそ 500,000 ~ 1,000,000 件に
なります。(導入先によって上記範囲内で変動する)
データはさらに区分によって判別されるようになっております。

プログラムから投入する SQL 文については、
最適化を行ってお...続きを読む

Aベストアンサー

1冊のマニュアルになるボリュームがあって色々書かれているので
開発者ガイドを見てください。
「アプリケーション開発者ガイド- ラージ・オブジェクト」です
個人的には設計段階でLOBは使用しないように最大限粘っていると思います。

参考URL:http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/appdev.102/B19247-01/toc.htm

QSQLローダーで複数のCSVファイルのデータを一つのテーブルにInsertしたい

お世話になります、
以下のようにデータをSQLLDRでインサートしようと思っているのですが、複数のCSVファイルのデータを一つのテーブルにInsertしたい場合にどのようにすればいいか教えてください。

--バッチファイル
sqlldr userid=fmwuser/fmwuser@fmw001 control=ctl/AUTHORITY.CTL log=section1.log data=csv/AUTHORITY.csv

--CTLファイル
LOAD DATA
TRUNCATE
INTO TABLE AUTHORITY
FIELDS TERMINATED BY ','
( AUTHORITYCODE ,AUTHORITYNAME,EXECUTIVE)

CTLファイルでTRUNCATEを付けるとテーブルを初期化してからインサートするからむりですよね...
TRUNCATEをはずすと、データが入っているテーブルに対してSQLLDRは使用できないと怒られるし...

CSVファイルを一つにまとめるしかないのでしょうか?

お世話になります、
以下のようにデータをSQLLDRでインサートしようと思っているのですが、複数のCSVファイルのデータを一つのテーブルにInsertしたい場合にどのようにすればいいか教えてください。

--バッチファイル
sqlldr userid=fmwuser/fmwuser@fmw001 control=ctl/AUTHORITY.CTL log=section1.log data=csv/AUTHORITY.csv

--CTLファイル
LOAD DATA
TRUNCATE
INTO TABLE AUTHORITY
FIELDS TERMINATED BY ','
( AUTHORITYCODE ,AUTHORITYNAME,EXECUTIVE)

CTLファイルでTRUNCATEを付けると...続きを読む

Aベストアンサー

No.1のyujiさんが述べているとうりですが、もう少しヒントをあげます。

・コントロールファイルで、"truncate"ではなく"append"を使うこと。
・コントロールファイルに、"infile"で読み込み対象のファイルを指定。
 "infile"は1コントロールファイルに複数記述できます。

あとは、Oracleのマニュアルをよく読むこと!
マニュアルをよく読めば、この程度のことは全て説明が記載されています。

QExcel VBA で Oracle CLOB型カラムの文字列を取得する方法

Excel VBA を使用して、Oracleに格納されている文字列を取得しようとしています。

Number型やVarchar2型のカラムからは問題なく取得できるようになったのですが、CLOB型で文字列を格納しているカラムからの取得でつまずいています。

自分の書いた方法だと、1600バイト以上の文字列が格納されているとエラー文字が返ってきてしまいます。

これ以上の文字数を取得する方法について教えてもらえないでしょうか?


'---// コード抜粋 ココから //---

'ORAセッション生成
Set OraSession = CreateObject("OracleInProcServer.XOraSession")

'ORADB生成
Set OraDatabase = OraSession.OpenDatabase(<<dbname>>, <<id>> & "/" & <<passwd>>, 0)

Dim SQL As String '一覧取得用SQL
Dim RS As Object 'レコードセット

SQL = " SELECT <<<clob_col_name>> FROM <<table_name>> "

Set RS = OraDatabase.DbCreateDynaset(SQL, 0&)

Range("A1").Value = RS.fields("<<clob_col_name>>").GetChunk(0, 3263)

RS.Close

'---// コード抜粋 ココまで //---


環境は、Excel 2003、Oracle 9iです。
ひとつよろしくお願いいたします。

Excel VBA を使用して、Oracleに格納されている文字列を取得しようとしています。

Number型やVarchar2型のカラムからは問題なく取得できるようになったのですが、CLOB型で文字列を格納しているカラムからの取得でつまずいています。

自分の書いた方法だと、1600バイト以上の文字列が格納されているとエラー文字が返ってきてしまいます。

これ以上の文字数を取得する方法について教えてもらえないでしょうか?


'---// コード抜粋 ココから //---

'ORAセッション生成
Set OraSession = CreateObje...続きを読む

Aベストアンサー

>1600バイト以上の文字列が格納されていると

本当に1600バイトジャストで起こりますか?

GetChunk(0, 3263)
で、チャンクサイズを3263バイト取ってあるのがまずいような気がします。

http://www.shift-the-oracle.com/element/data-type/data-type-inside.html
を見ると分かるように、CLOB型の内部データ型は2バイト固定文字列ですので
この指定方法だと3263が奇数なので、2バイト文字を途中で割ってしまいまい、取り出せないのではないでしょうか。
従って3262バイト(=1631文字)までは大丈夫で、それ以上の文字列が格納されている場合は最後にゴミがついてくるため怒られると思います。

GetChunkメソッド
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/win.102/B25023-01/sermthod.htm#CIHGIFFD

※第2引数は文字数ではなくバイト数です

>1600バイト以上の文字列が格納されていると

本当に1600バイトジャストで起こりますか?

GetChunk(0, 3263)
で、チャンクサイズを3263バイト取ってあるのがまずいような気がします。

http://www.shift-the-oracle.com/element/data-type/data-type-inside.html
を見ると分かるように、CLOB型の内部データ型は2バイト固定文字列ですので
この指定方法だと3263が奇数なので、2バイト文字を途中で割ってしまいまい、取り出せないのではないでしょうか。
従って3262バイト(=1631文字)までは大丈夫で、そ...続きを読む

QCSV形式のファイルを読み込んでテーブルに格納するには?(BULK INSERT、BCP、DTS)

VisualBasicのカテゴリでも質問したのですが、
こちらの方が回答がつく可能性が高いのではと思い、こちらにも書き込みました。

今、
"aaa","bbb","ccc" 
のような形で1レコードのCSVファイルがあります。
これをSQLServer2000上のテーブルに読込みたいのですが、
10件ほどの少ないレコードなら
各フィールドごとを変数に入れて読込み、
それをループさせてINSERT INTO すればよいのですが・・・。

大量の件数の場合時間がかかりすぎてしまいます。
それで、BULK INSERT、BCP、DTS などの利用を考えているのですが、

まず、何よりこの質問です。

(1)このようなファイル形式のものを上記の方法で読込めるのか?

実現可能なのかをまずお聞きしたいです。
どなたか、成功されている方はいらっしゃいますか?

(2)BCPでファイルのフォーマットを指定したファイルを用意して試みたところ、
""で区切られているため、その部分もフィールドに取り込まれてしまい、
binaryデータが切り詰められましたとなってしまいます。
この回避方法はないでしょうか?

(3)""が余計なので、これを変換して読込むことは可能ですか?
DTSはVisualBasic上からコマンドとして利用したいです。
batファイルを用意してもいいです。

困っています。どなたか助けてください。

VisualBasicのカテゴリでも質問したのですが、
こちらの方が回答がつく可能性が高いのではと思い、こちらにも書き込みました。

今、
"aaa","bbb","ccc" 
のような形で1レコードのCSVファイルがあります。
これをSQLServer2000上のテーブルに読込みたいのですが、
10件ほどの少ないレコードなら
各フィールドごとを変数に入れて読込み、
それをループさせてINSERT INTO すればよいのですが・・・。

大量の件数の場合時間がかかりすぎてしまいます。
それで、BULK INSERT、BCP、DTS などの利用を...続きを読む

Aベストアンサー

DTSインポートエクスポートウィザードを使用すれば、”を含むCSVファイルでもよ見込むことが出来ますよ。
[スタート]-[プログラム]-[Microsoft SQL Server]-[データのインポートとエクスポート]から呼び出すことも出来ます。

変換元(データのコピー元)にCSVファイル(データソース:Text File)を選択して、変換先に接続するSQLServerとデータベース名を指定して・・・
順次設定していけば、設定できますよ。
#最後にちゃんと保存してくださいね。

話は変わりますが、最初の質問から派生して関連する質問をするのであれば、ちゃんと最初の質問を終了してから新規の質問を作成してください。感じ悪いです。回答している人の気持ちを考えてください。

QCLOBデータの取得方法

実行環境は、WindowsXP,VB6(SP6),Oracle10gで、oradc.ocxを使ってoo4接続しています。
SELECT実行時は、ORA_DYNASET.Fieldsを参照して.VALUEから検索結果値を取得しています。
今まで、LONG型フィールドは何もせずに値の取得が可能でしたが、
CLOB型に変更したことにより、ここでエラーが発生するようになりました。
CLOBのフィールドにto_char関数をかけると、.VALUE参照時のエラーは無くなりましたが、データが4000バイトで切れてしまいます。
現在当方での唯一の回避策は、CLOB型フィールド名を"A"とすると、
to_char(substr(A,1,4000)),
to_char(substr(A,4001,4000)),
to_char(substr(A,8001,4000)) ・・・・・
といった形でのSELECT文をきる事になります。

そもそもは、.VALUEプロパティ参照時のエラーを無くしたいのですが、無くす方法、又は、それにみあう代替策をご存知の方は教えてください。

※なお、LONG型の場合も、10gになってからはデータが4000バイトで切れるとの報告も受けております。最初はTO_CHAR関数のせいだと思っていましたが、VB側のオブジェクトの壁なのでしょうか・・・

実行環境は、WindowsXP,VB6(SP6),Oracle10gで、oradc.ocxを使ってoo4接続しています。
SELECT実行時は、ORA_DYNASET.Fieldsを参照して.VALUEから検索結果値を取得しています。
今まで、LONG型フィールドは何もせずに値の取得が可能でしたが、
CLOB型に変更したことにより、ここでエラーが発生するようになりました。
CLOBのフィールドにto_char関数をかけると、.VALUE参照時のエラーは無くなりましたが、データが4000バイトで切れてしまいます。
現在当方での唯一の回避策は、CLOB型フィールド名を"A"とする...続きを読む

Aベストアンサー

OraField オブジェクトの .GetChunk() を使用するか、OraCLOB オブジェクトを使用してみてはどうでしょうか?

Q構造が同じ別テーブルInsert Into する場合

追加クエリをVBA上のSQLで作成しています。

A.MDBとB.MDBに同名のTable_Aがあり、フィールドも同じです。。

これを重複をチェックするためにField_Aでジョインさせていますが、
テーブル名もフィールド名も同じなために区別ができません。

どのようにして区別するとよいのでしょうか?

Aベストアンサー

#1です。リンクを張って

INSERT INTO Table_A1
SELECT Table_A.*
FROM Table_A LEFT JOIN Table_A1 ON [Table_A].[ID]=[Table_A1].[ID]
WHERE ((([Table_A1].[ID]) Is Null));

みたいなSQL文でいかがでしょう

QSn = 1 + 2x + 3・x^2 + 4・x

Sn = 1 + 2x + 3・x^2 + 4・x^3 + ・・・ + n・x^(n-1)
x・Sn = x + 2・x^2 + 3・x^3 + 4・x^4 + ・・・ + n・x^n
(1-x)Sn = 1 + x + x^2 + x^3 + x^4 + ・・・ + x^(n-1) - n・x^n
x(1-x)Sn = x + x^2 + x^3 + x^4 + ・・・ + x^(n-1) + x^n - n・x^(n+1)
(1-x)^2・Sn = 1 - (n - 1)・x^n + n・x^(n+1)


このあと、
場合わけらしいのですか、わからないのでおしえてください
ちなみに、これは
1番最初の式の和を求める数列の問題です!

早めにお願いします

Aベストアンサー

>x(1-x)Sn = x + x^2 + x^3 + x^4 + ・・・ + x^(n-1) + x^n - n・x^(n+1)
>(1-x)^2・Sn = 1 - (n - 1)・x^n + n・x^(n+1)
ここの計算が間違っています。
正しくは
(1-x)^2・Sn = 1 - (n + 1)・x^n + n・x^(n+1) …(★)

場合分けは
両辺を(1-x)^2で割るので x=1のとき (1-x)^2=0では割れないので
x=1とx≠1の場合分けをします。

x≠1の場合 (1-x)^2≠0なので
(★)の両辺を(1-x)^2で割って
 Sn={1-(n+1)・x^n + n・x^(n+1)}/(1-x)^n
x=1の場合
 Sn=1+2+ … +n ={(1+2+ … +n-1 +n)+(n +n-1+ … +2+1)}/2
={(1+n)+(1+n)+ … +(1+n)+(1+n)}/n
={(n+1)*n}/2
=n(n+1)/2

QSQLite:項目が存在しない場合のみINSERT

SQLiteのテーブル内にunique属性を持つフィールドがあります。このフィールドと同名の内容を追加するとエラーが返りますが、SQLiteを呼び出すプログラム側で逐一そのエラーを例外処理しているため、プログラムとしては効率が悪いです。「(If not exist (...) insert ...のような)もしこの項目内容が存在しなければフィールドを追加する」という処理をSQLのクエリ文で完結させたいのですが、このようなことはできますでしょうか。

Aベストアンサー

field追加(alter table)じゃなくて、「行追加時に、uniqueカラムのデータがかち合ったら追加しない」でいいですか?
「制約競合解決アルゴリズム」を ON CONFLICT で指定します
conflict-algorithm ::=ROLLBACK | ABORT | FAIL | IGNORE | REPLACE
insert文では、ON CONFLICTの代わりに or で記述できます
INSERT OR IGNORE INTO table-name (column-list) VALUES(value-list)
参考
http://www.3rd-impact.net/Document/SQLite/Translation/Current/lang_conflict.html


人気Q&Aランキング

おすすめ情報