DB

Oracleのアーカイブログで以前のデータを消す方法

DB

リカバリマネージャRMANでアーカイブログを削除できるが、実際のアーカイブログフォルダを見ると リストにも表示しないファイルがまだ残っていたりすることがある。 この場合はOS側から削除してもいいらしい。削除の手順としては以下のとおり。 まずRMANを実…

Oracleの文字列リテラルn'文字'

DB

NCHAR,NVARCHAR2の型の場合の指定方法。 select * from tbl where col=n'文字列'; のようにn'文字列'と指定(N'文字列')でも可。以下が参考サイト。 文字・数値 リテラル - オラクル・Oracleをマスターするための基本と仕組み

Oracleで接続制御(制限)をやってみた

DB

$ORACLE_HOME/network/admin/sqlnet.oraに以下のような記述をすることで、 TCPレベルでホスト名またはIPアドレス(IPv4 or IPv6)で制限できる。なので sqlplusはもちろん、各種ツール、ODBCなどの接続も制限可能。 IPアドレスについてはワイルドカード指定、C…

Oracle SQL文(ステートメント)の最大長

DB

9iまでは64KB。それ以降は上限はないらしい。 以下が参考サイト。 Oracle11gのSQLの最大文字数 Oracle 性能限界 - オラクル・Oracleをマスターするための基本と仕組み

PL/SQLのCASE文のELSEって省略できない

DB

PL/SQLを実行すると、 エラーコード: ORA-06592 詳細: CASE文の実行中にCASEが見つかりません となってしまった場合は、 OracleのPL/SQLに記載したCASE WHEN ... END CASEでELSEを省略している可能性あり。 https://www.366service.com/jp/qa/82975fbbfe8c0f…

アーカイブログ関連の確認

DB

アーカイブログモードかどうか ARCHIVELOG/NOARCHIVELOGのどちらか。 SQL> select log_mode from v$database; アーカイブログの出力先の確認 SQL> show parameter log_archive_dest;

OracleのSQLファイルに引数を渡す場合のドット(.)

DB

-- test.sql -- スキーマ名.テーブル名でスキーマを引数から取得 SELECT COUNT(*) FROM &1..MYTBL; EXIT; C:\> sqlplus FOO/PASS@SERVICENAME @test.sql SCHEMATEST ドットは区切り文字ということなので&1.が引数に展開されて SCHEMATEST.MYTBLになる。 SET …

Oracleのv$sessionのSQLを参照してみたい

DB

v$sessionのstatusがINACTIVEの場合は大抵sql_idがなくってsqlがわかんねって思っていたら 以下のサイトを参考にしたところわかりそうだったのでメモ。 https://qiita.com/e99h2121/items/5032d081b11fba684420 ここの【2】を参考にしてみた。 SELECT a.sid …

Oracleのリスナのログ

DB

「diagnostic_dest」/diag/tnslsnr/ホスト名/リスナー名/trace/リスナー名.log 「diagnostic_dest」は初期化パラメータ。 SQL> show parameter diagnostic_dest 参考は以下。 https://www.sql-dbtips.com/listener/log/

Oracle パッケージのコンパイル

DB

パッケージボディをcreate or replace package bodyで入れ替えたりしていると 自動的にコンパイルしてくれてprocedure/functionが使用できていたものが、急にエラーで使えなかったりすることがあった。 この原因を突き止めたいのだが、とりあえず手動でコン…

SQL*Plusで 空行(空白行)があるとcreate tableがエラー

DB

知らなかったよ、こんな仕様。 -- create-table.sql CREATE TABLE TEST ( ID VARCHAR2(8) NOT NULL PRIMARY KEY, NAME VARCHAR2(255), OTHER VARCHAR2(255) ) -- 5行目が空行 SQL> @create-table.sql SP2-0042: 不明なコマンドです(")")。行の残りは無視され…

Oracleでの現在のログインユーザ

DB

SQL*Plusでconnとかしてユーザ変更してわからなくなったら。 select username from user_users;

Oracleでとりあえずデータセーブ

DB

データだけをセーブして元テーブルを(完全)削除。 CREATE TABLE TABLE_FOO_SV AS SELECT * FROM TABLE_FOO; DROP TABLE TABLE_FOO PURGE; TABLE_FOOのKEYやINDEXなどを削除してテーブル再作成するときなど。

テーブルスペースの削除

DB

テーブルスペースを削除する際に実際のデータファイルも削除するとき、 [INCLUDING CONTENTS]のあとに[AND DATAFILES]をつける([AND DATAFILES]だけでは削除文として成立しない)。 表領域のオブジェクト、実際のデータファイル、参照整合性制約も削除。 SQL>…

Oracle アーカイブログモードの確認

DB

アーカイブログ(archive log)モードかどうかを確認する。SYS権限でログインして以下を実行。 SQL> select log_mode from v$database; LOG_MODE ------------ ARCHIVELOG noarchive logモードであれば、NOARCHIVELOGと出力。 以下のサイトが詳しい。 ORACLE …

PL/SQLの添字配列の値が配列

何度やっても忘れちまうんで備忘録。 ちなみにPL/SQLの通常の配列インデックスは1オリジン参考。 SET SERVEROUTPUT ON -- -- 添字配列の値が配列の例 -- DECLARE TYPE tNameArray IS VARRAY(2) OF VARCHAR2(128); TYPE tSoejiArray IS TABLE OF tNameArray I…

Oracleでユーザまるごと削除しようとしたときのエラーについて

ユーザまるごとオブジェクトを削除しようとして、 SQL> DROP USER FOO CASCADE 行1でエラーが発生しました。 ORA-01940: 現在接続中のユーザを削除することは出来ません。 となるときがあり、もちろん接続しているユーザを確認してから実行したのだけれどな…

where, group by, havingとかの評価(優先)順位

DB

where -> group by -> having -> select -> order by の順で評価するのでhavingにはselectでつけた別名を指定できない。order byには指定できる。 例:年が2010以降で名前ごとの件数が1より大きいものを大きい順で表示。 select name, count(*) cnt from TBL…

NULLがある場合のSQLのWhere句の条件に注意

DB

OracleのSQLでハマったんで備忘録(というか知らなかっただけ)。 テーブルTBL_Aが、 ID SEI MEI 1 鈴木 太郎 2 鈴木 二郎 3 NULL NULL 4 佐藤 一郎 で、SELECT文が select * from TBL_A where SEI <> '佐藤'; だと結果は以下。 ID SEI MEI 1 鈴木 太郎 2 鈴…

SQLでのマルチバイト(全角)のワイルドカード(%, _)

動かないであろうと思った以下のselectがちゃんと動いた。 select * from table where TO_MULTI_BYTE(UPPER(COLUMN_NAME)) like TO_MULTI_BYTE(UPPER('%test%')); http://metroit.hatenablog.jp/entry/2017/05/12/095949 を見ると Oracle のバージョンが11.2…

PL/SQL配列・ループテスト

PL/SQLの配列=コレクション型 に詳細がある。配列は1オリジン。配列のメソッドについては、 配列で使用可能なメソッド が詳しい。 /* * C:\> C:\ORACLE\PRODUCT\XX.Y.Z\CLIENT_1\bin\sqlplus.exe USER/PASSWORD@SCHEMA * SQL> SET SERVEROUTPUT ON */ DECLA…

明示的なカーソル

DB

参考は以下。 https://www.shift-the-oracle.com/plsql/cursor-loop.html -- -- 指定行数だけ昇順IDを表示 -- SET SERVEROUTPUT ON DECLARE -- 引数なしの場合は()もいらない CURSOR cX(MAX NUMBER := 100) IS SELECT ROWNUM, A.* FROM (SELECT ID FROM B WH…

OracleでDDLを実行するとその前のDMLがコミットされる件

DB

表題のとおりなんだけどマニュアルに書いてありました。 様々な種類のSQL文 Oracle Databaseは、暗黙的にすべてのDDL文の前後で現在のトランザクションをコミットします。

Oracle SQLでのコメントの書き方

DB

OracleのSQLファイルに以下のようにコメントを書いていたら動かなかった。 UPDATE MYTABLE SET COL1='TEST' WHERE ID='FOO'; -- これはテスト これってよくある間違い?

SI Object Browser for Oracleで実行計画でのエラー

DB

SI Object Browserで実行計画ボタンをクリックしてSQL実行をクリックすると、 ORA-00911: 文字が無効です。 のダイアログが表示される。実行計画なしだと問題がないのに。 どうも、最後のセミコロン";"を削除すると動作するようだ。それこそ(;o;)な感じ。 こ…

SQLでFOR UPDATEを使って更新する例

DB

セレクト結果の1レコードずつ更新したい場合の例。 以下を参照して作成。 SQL を繰り返し実行する 【ORACLE】日付の加算減算、時刻の加算減算 SET SERVEROUTPUT ON DECLARE cursor CUR is SELECT ID,NAME,UPDATE_TIME FROM テーブル名 WHERE '1000' <= ID A…

PL/SQLのFORループで指定IDのデバッグ表示

DB

テーブルのIDカラムが4桁(0000 .. 0009)の場合。 SET SERVEROUTPUT ON DECLARE vID テーブル名.ID%TYPE; vName テーブル名.NAME%TYPE; vUpdateTime テーブル名.UPDATE_TIME%TYPE; BEBIN FOR i IN 0 .. 9 LOOP vID := TO_CHAR(i, 'FM0000'); -- 4桁 SYS.DBMS_…

SQL*Plusでの表示の基本

備忘録。デフォルトだとなんであんなに見辛いんだろう。 set linesize 1000 set trimspool on set pagesize 0

Oracleのストアドでのエラーの備忘録

DB

以下のエラーについて調べたのでまとめ備忘録。 ORA-04068: パッケージの既存状態は廃棄されました。 ORA-04061: package body “スキーマ.パッケージ名"の既存状態は無効になりました。 ORA-06508: PL/SQL: コールしているプログラム単位が見つかりませんで…

Oracle CREATE DIRECTORYでディレクトリオブジェクトを使用

DB

PL/SQLでUTL_FILE()なんかを使う場合に便利なディレクトリオブジェクト CREATE DIRECTORY オブジェクト名 AS '/path/to/foo/bar'; GRANT READ ON DIRECTORY オブジェクト名 TO ユーザ名; GRANT WRITE ON DIRECTORY オブジェクト名 TO ユーザ名; こうしておく…