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);