[ Oracle ] ROWID と文字列を相互に変換する ( ROWIDTOCHAR / CHARTOROWID )

Pocket

Oracle でレコード固有の値である ROWID と文字列を相互に変換するサンプル SQL を掲載しています。特定のレコードを抽出するために多く使用されています。

スポンサーリンク

ROWID を文字列に変換する

ROWIDTOCHAR 関数を使用して ROWID を文字列に変換するサンプル SQL です。

select ROWIDTOCHAR(ROWID) as RID from table1

なお、以下の SQL は、Oracle 予約文字列 ROWID と混同されるため警告が出力されます。どうしても使用したい場合はエスケープさせる必要があります。

-- NG
select ROWIDTOCHAR(ROWID) as ROWID from table1
-- ORA-00923: FROMキーワードが指定の位置にありません。 in ・・
-- ORA-24374: フェッチまたは実行してフェッチする前に、定義されていません in ・・・

-- OK
select ROWIDTOCHAR(ROWID) as "ROWID" from table1

文字列を ROWID に変換する

次は文字列を ROWID に変換する SQL になります。こちらも関数名そのものですが、CHARTOROWID 関数を使用します。なお、文字列のまま使用しても問題ないようです。

delete from table1 where ROWID = CHARTOROWID('AAARXwAAEAAAAKbAAE')

-- ROWID 文字列をそのまま、条件に用いても OK
delete from table1 where ROWID = 'AAARXwAAEAAAAKbAAE'

ROWID は URL エンコードが必要

ROWID に使用される文字は上記のような英字のみとは限りません。URL エンコードが必要な ‘+’ なども文字列に含まれることがあります。以下は、PHP でのサンプルになりますが、GET パラメータに ROWID を付与する(しない場合でもいつでも)ときには、URL エンコードする必要があります。

// ROWID を取得する SQL
$sql = 'select ROWIDTOCHAR(ROWID) AS RID from table1 where file_name = :fname';
$fname = 'filename.txt';

// データベースへ接続
$conn = oci_connect('user', 'password', 'localhost/XE');

$stmt = oci_parse($conn, $sql);
oci_bind_by_name($stmt, ':fname', $fname);
oci_execute($stmt, OCI_NO_AUTO_COMMIT);

// 先頭のレコードのみ取得
$row = oci_fetch_array($stmt, OCI_ASSOC);

// ROWID を取得(URL エンコードを行う)
$encodedRowId = urlencode($row['RID']);

// リソース開放処理
oci_free_statement($stmt);
oci_close($conn);

// GET パラメータをつけて別ページへリダイレクト
header("Location: http://localhost/recvrowid.php?rowid=" . $encodedRowId);
参考
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *