別テーブルの値で対象テーブルの値を更新 [Oracle]
テーブルの値を更新する際に、別のテーブルからもってくる。oracleでやってみました。
TABLE_A
KEY_A number(10,0)
KEY_B number(10,0)
COL1 varchar2(10)
TABLE_B
KEY_B number(10,0)
COL1 varchar2(10)
TABLE_AのCOL1にTABLE_BのCOL1の値をセットする。
【誤ったやりかた】
update TABLE_A a
set COL1 = (select b.COL1 from TABLE_A a,TABLE_B b where a.KEY_B=b.KEY_B);
こんなエラーが発生
SQLエラー: ORA-01427: 単一行副問合せにより2つ以上の行が戻されます
01427. 00000 - "single-row subquery returns more than one row"
副問合せ内のfromに更新対象テーブルを記載してはダメ!
【正しいやり方】
update TABLE_A a
set COL1 = (select b.COL1 from TABLE_B b where a.KEY_B=b.KEY_B);
これで解決しました。
Oracleテーブルでclob、blobを使った際、格納データサイズを調べる方法 [Oracle]
create table lob_table(
id number,
lob_data clob
);
clobで定義したlob_dataの格納データサイズを取得するには、DBMS_LOB.GETLENGTHを使用する。
こんな感じ。
select id, DBMS_LOB.GETLENGTH(lob_data) from lob_table;
blobで同じように使えます。
Oracle timestamp型項目をシステム時刻で更新 [Oracle]
Oracleでシステム時刻を扱うにはsystimestampを使う。
update x_table
set access_time = systimestamp
where id=1;
これだけ。実に簡単。
ログオン時のユーザ名とパスワードを忘れてしまった [Oracle]
もちろん、元のパスワードは暗号化されているので、調べることができない。
そこでパスワード変更を実施する。
SYSDBAで接続して、
select username from dba_users;
でユーザ名を確認し、
ALTER USER