【最大10000ポイント】当たる!!質問投稿キャンペーン!

お世話になります。


LONG型のカラムに長い文字列がセットされてるのですが、その文字列の中からある特定の文字列を別の文字に置換したいのです。

SELECT ~ REPLACEを使おうと思ったのですが、LONG型では使えないらしく、PLSQLにて以下のように作成しました。


DECLARE
CURSOR CURSOR1 IS SELECT * FROM T_テーブル;
HIGH_VALUE_WORK VARCHAR2(32760);
BEGIN
FOR REC_CURSOR1 IN CURSOR1 LOOP
HIGH_VALUE_WORK := REC_CURSOR1.カラム;
HIGH_VALUE_WORK := REPLACE(HIGH_VALUE_WORK, 'あああ', '   ');
REC_CURSOR1.カラム := HIGH_VALUE_WORK;
END LOOP;
END;
/


しかしテーブルを確認しても変更されてませんでした。
更新直後に試しにセレクトかけてDBMS_OUTPUTすると正しく更新されてました。

Oracleは10gR2です。


ご存知の方どうかよろしくお願いします。

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

A 回答 (1件)

Updateしてないようですけど。


CURSOR CURSOR1 IS SELECT * FROM T_テーブル FOR UPDATE;
として、
REC_CURSOR1.カラム := HIGH_VALUE_WORK;
ではなく、
UPDATE T_テーブル SET .カラム = HIGH_VALUE_WORK WHERE CURRENT OF CURSOR1 ;
では
    • good
    • 0

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

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

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

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

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

QORACLEでLONG項目からCHAR項目へ桁数指定で文字列を抽出

ORACLEでLONG項目からCHAR項目へ桁数指定で文字列を抽出したいのですが、方法はありますか?
LONG項目の先頭から30桁分の文字を抽出し、CHAR項目に入力したいのですが。

会社で使用しているERPパッケージでLONG項目があり、どうしてもこの項目から文字が抽出したいのです。

回答のほど宜しくお願いします。

Aベストアンサー

ちょっと質問の意図がわからないのですが、
例えば、T1,T2の2つのテーブルがあったとして、
T1のnumというnumber(10)の項目があって、その中から
先頭の5桁を取ってきて、T2のcommentというCHAR(5)の
項目に転送するなら、
まず、T1のnumから5文字取ってきて、それを変数hoge[chr(5)]に入れる。

select substrb(to_char(num),1,5) into hoge from t1 where id=1;

それから、hogeをT2のcomment列に挿入する。

insert into t2(id,comment) values (1,hoge);

んで、最後にcommitしたらOKです。

こんなもんでよかったでしょうか?

QオラクルのLONG RAW型のテーブルの操作方法と容量計算の仕方

オラクル8.1.6で、LONG RAW型のカラムがあるテーブルへのインサート、アップデートの方法を教えてください。
Pro*Cで作成したツールはあるのですが、自分が少し扱えるPL/SQLでツールを持ちたいのです。BLOB型などはパッケージを使うということまではわかったのですが、LONG RAW型については、サイト検索しても見当たらないように思います。
また、テーブルの容量計算も通常のVARCHAR型やNUMBER方とは違うようです。VARCHAR型と同様の方法で計算してみたのですが、実際にPro*Cでテストデータをロードしてみたところ、見積もり以上のの容量を消費するようです。
よろしくお願いします。

Aベストアンサー

こんにちわ。

> utl_raw.lengthファンクションを試してみましたが、LONG RAW型には
> 対応していないみたいです。エラーではねられました。
についてですが、utl_raw パッケージでlong raw 型を操作する事は
可能です。
但し PL/SQL では、long/long raw 型のデータ型が扱えるデータ長が
32760 バイトに制限されている事が原因だと思われます。
恐らく、long raw の項目に格納したデータが長すぎたのだと思います。
→ この件は、「PL/SQL ユーザーズガイドおよびリファレンス」の
  「第2章 基礎」のLONG とLONG RAW に記載されています。

32761 バイト以上のlong/long raw のデータ長をPL/SQL から調べるには、
DBMS_SQL.DEFINE_COLUMN_LONG で、Long raw 列をVarchar2 変数に対応
付けて、DBMS_SQL.COLUMN_VALUE_LONG で データを分割して取り出して、
その際の長さを合計するしかないようです。
どっちみち、PL/SQL でlong/long raw を操作するのは面倒そうですね。

こんにちわ。

> utl_raw.lengthファンクションを試してみましたが、LONG RAW型には
> 対応していないみたいです。エラーではねられました。
についてですが、utl_raw パッケージでlong raw 型を操作する事は
可能です。
但し PL/SQL では、long/long raw 型のデータ型が扱えるデータ長が
32760 バイトに制限されている事が原因だと思われます。
恐らく、long raw の項目に格納したデータが長すぎたのだと思います。
→ この件は、「PL/SQL ユーザーズガイドおよびリファレンス」の
  「第2章 基礎」...続きを読む

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

で確認ができる。

QOracleでの文字列連結サイズの上限

Oracle9iでテーブル内容をスプール出力していますが、カラム単位で余白を削除したい
(トリムをかけたい)ので以下のようにカラムを連結させてスプールしています。
set colsep ','
spool test.csv
select
a ||','||
b ||','||
c
from test_table
spool off

実際の項目数は100以上あり、レコードの最大長も数千バイトになりますが、
各項目にMAXの値を入力して上記スプールを実行したところ、以下のエラーメッセージが
出力されました。
「ORA-01489: 文字列を連結した結果、長さが最大長を超えました」

データを連結した結果の長さが上限を超えたということなのでしょうが、
この最大長はどこで設定されているものなのでしょうか?
また、そもそもスプール出力でトリムが効かないためにこのようなやり方で
出力していますが、他によい方法をご存知の方いましたら教えて下さい。
よろしくお願いします。

Aベストアンサー

>>Code Tipsの内容も実際に試してみたのですが、結局のところ項目を連結させる
>>やり方では4000バイトまでが限度ということだと判断したのですが

4000バイトまでが限度 とは、どのような理由からでしょうか?
以下のSQLで4000バイトオーバーは可能です。(32KBの壁はあります)

既に完成度の高いスクリプトがデバッグ済みで存在するのに
同じものを 1からコーディングするのは、(自分の勉強にはなるとは思いますが) 意味のない行為だと思いますので、
Code Tipsをお勧めしました。

SPOOL HOGE.TXT
SET PAGESIZE 0
SET LINESIZE 32767
SET LONG 40000
SET LONGC 40000
SET TRIMSPOOL ON
SET FEEDBACK OFF
SET VERIFY OFF

SELECT
TO_CLOB('')
|| LPAD('1', 4000,'1')
|| LPAD('2', 4000,'2')
|| LPAD('3', 4000,'3')
|| LPAD('4', 4000,'4')
|| LPAD('5', 4000,'5')
|| LPAD('6', 4000,'6')
|| LPAD('7', 4000,'7')
|| LPAD('8', 4000,'8')
|| LPAD('9', 4000,'9')
|| LPAD('0', 4000,'0')
FROM DUAL
/
SPOOL OFF

>>Code Tipsの内容も実際に試してみたのですが、結局のところ項目を連結させる
>>やり方では4000バイトまでが限度ということだと判断したのですが

4000バイトまでが限度 とは、どのような理由からでしょうか?
以下のSQLで4000バイトオーバーは可能です。(32KBの壁はあります)

既に完成度の高いスクリプトがデバッグ済みで存在するのに
同じものを 1からコーディングするのは、(自分の勉強にはなるとは思いますが) 意味のない行為だと思いますので、
Code Tipsをお勧めしました。

SPOOL HOGE.TXT
SET...続きを読む

QCLOB型へのINSERT

いつも参考にさせて頂いています。

まず、問題はCLOB型に4000Byte以上のデータを
格納出来なくて困っております。

環境は下記のとおりです。
OS:Windows2003
Oracleバージョン:9.0.1.4.0

テストした手順は
(1)テーブル作成
create table TEST_TBL (
id number(9),
data clob
);

(2)INSERT
insert into TEST_TBL values(1,'4000Byte以上のデータ');

ORA-01704: 文字列リテラルが長すぎます


CLOBは4Gまで入るはずなのになぜなんでしょうか?
ご回答よろしくお願いいたします。

Aベストアンサー

リテラルを分割する方法や PL/SQL を使用する方法もあります。

参考 URL にサンプルがあります。

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


人気Q&Aランキング