【PL/SQL】予約語完全ガイド|11カテゴリ500語・TOP10事故予約語・V$RESERVED_WORDS・命名規則・引用符識別子の罠

【PL/SQL】予約語一覧と使い方|変数名に使えないキーワードまとめ PL/SQL

PL/SQL(およびOracle SQL)には、言語仕様で特別な意味を持つ予約語500語以上あります。DATETYPELEVELCOUNTといったつい使いたくなる名前は全て予約語で、v_dateではなくdateを変数名にするとPLS-00103 / ORA-00923エラーでコンパイルが通りません。

入門記事の多くは「こんな単語は使うな」という一覧だけで終わっていますが、実務では予約語(Reserved Words)とキーワード(Keywords)の違い、V$RESERVED_WORDSで最新リストを確認する方法、引用符囲み識別子("ORDER")の挙動、レガシーテーブルで既に予約語列を持ってしまった場合の対処、事故多発TOP10の予約語など、深い知識が必要です。

この記事ではPL/SQLの予約語をカテゴリ別500語以上でカバーし、予約語誤用時のエラーメッセージ、引用符囲み識別子の完全解説、実務で事故るTOP10予約語(LEVEL/COUNT/DATE/TYPE/NAME等)、レガシー対処パターン、命名規則ベストプラクティスまで網羅した決定版です。関連する【PL/SQL】IF文完全ガイド【PL/SQL】例外処理完全ガイド【PL/SQL】変数・定数完全ガイドと併読推奨。

この記事で学べること

  • 予約語(Reserved)とキーワード(Keyword)の違い
  • V$RESERVED_WORDSビューで最新予約語を調べる方法
  • カテゴリ別予約語一覧(11カテゴリ500語以上
  • PL/SQL特有の予約語(EXCEPTIONPRAGMA%TYPE等)
  • 実務で事故るTOP10予約語(LEVELCOUNTDATETYPE等)
  • 引用符囲み識別子"Order")の罠
  • 誤用時のエラーメッセージ集(PLS-00103等)
  • 変数名の正しい命名規則v_プレフィックス/名詞・動詞)
  • 予約語列を持つレガシーテーブルの対処法
  • 2026年版のベストプラクティスチェックリスト
スポンサーリンク

30秒クイックリファレンス:予約語とは

予約語誤用の典型エラー
-- ❌ 予約語を変数名にするとコンパイルエラー
DECLARE
  date   DATE;                 -- DATEは予約語
  count  NUMBER;               -- COUNTは予約語(キーワード)
  level  NUMBER;               -- LEVELも要注意
BEGIN
  date := SYSDATE;             -- PLS-00103: 識別子 "DATE" が必要
END;

-- ⭕ プレフィックスで回避
DECLARE
  v_date       DATE;
  v_count      NUMBER;
  v_level      NUMBER;
BEGIN
  v_date := SYSDATE;
END;

3つの黄金律:①変数名にv_プレフィックスを必ず付ける、②テーブル列名も予約語を避ける(引用符回避のため)、③使うならV$RESERVED_WORDSで最新予約語を確認してから。

V$RESERVED_WORDSで予約語を確認

予約語リストの取得
-- Oracle 12c以降は V$RESERVED_WORDS ビューで全予約語を一覧可能
SELECT keyword, length, reserved, res_type, res_attr, res_semi, duplicate
FROM V$RESERVED_WORDS
WHERE reserved = 'Y'
ORDER BY keyword;

-- 列の意味
-- reserved:  'Y'=予約語(厳格)、'N'=非予約だが特殊用途あり
-- res_type:  'Y'=データ型として予約
-- res_attr:  'Y'=属性として予約
-- res_semi:  'Y'=セミ予約(一部構文で使用可能)
-- duplicate: 'Y'=重複(複数の役割を持つ)

予約語 vs キーワード:違いを理解する

Oracleのドキュメントで「reserved words」と「keywords」は別のカテゴリです。どちらも変数名に使うと問題が起きますが、制約の強さが違うのが重要なポイント。

分類 特徴 識別子利用
予約語(Reserved) 言語仕様の中核。必ず特別な意味を持つ ❌ 不可(引用符でも非推奨) BEGIN/SELECT/DECLARE/EXCEPTION
キーワード(Keyword) 特定の文脈で意味を持つが、識別子にも使える △ 可能だが混乱の元(非推奨) DATE/COUNT/NAME/TYPE/LEVEL
非予約(Non-reserved) 標準パッケージ名・関数名等(ユーザー定義可能) ○ 可能(但し標準機能を隠蔽) DBMS_OUTPUT/UTL_FILE/SUBSTR
実例:予約語とキーワードの挙動差
-- 予約語は絶対NG
DECLARE
  begin NUMBER;   -- PLS-00103: 識別子 "begin" が不正
BEGIN
  NULL;
END;

-- キーワードは文脈依存でエラーが出たり出なかったり
DECLARE
  date NUMBER;    -- 状況によってはコンパイル通るがSELECT内で衝突
BEGIN
  SELECT TO_CHAR(date, 'YYYY-MM-DD') INTO ...;  -- ここでエラー
END;

-- 非予約(標準関数名)は上書き可能だが危険
DECLARE
  FUNCTION substr(...) RETURN VARCHAR2 IS ...;   -- 標準SUBSTRが隠蔽される
BEGIN
  -- 以降この変数内では独自substrが呼ばれる
  NULL;
END;

実務では一律「避ける」

予約語・キーワード・非予約の境界は複雑で、Oracleバージョンごとに変わります。実務では「特別な意味を持つ単語」を一律避けるのが最も安全。v_プレフィックスを付ける運用なら意識する必要すらなくなります。

カテゴリ別予約語一覧

実務で使う予約語を11カテゴリに分類しました。PL/SQL固有のものと、Oracle SQL共通のものが混在する点に注意。

①ブロック構造・宣言

予約語 用途
DECLARE 変数・定数・例外を宣言するセクション開始
BEGIN 実行セクション開始/匿名ブロック開始
END ブロック/ループ/IF等の終了マーカー
EXCEPTION 例外ハンドラセクション開始
IS / AS ファンクション/プロシージャ本体開始
PRAGMA コンパイラ指令(EXCEPTION_INIT等)
PACKAGE パッケージ定義
BODY パッケージ本体
PROCEDURE プロシージャ定義
FUNCTION ファンクション定義

②制御フロー(IF / LOOP / CASE)

予約語 用途
IF / THEN / ELSIF / ELSE 条件分岐
END IF IF文終了
CASE / WHEN / END CASE CASE文
LOOP / END LOOP 基本ループ
WHILE WHILEループ
FOR / IN / REVERSE FORループ
EXIT / EXIT WHEN ループ脱出
CONTINUE / CONTINUE WHEN ループ次イテレーション(11g+)
GOTO ラベルへジャンプ(非推奨)
RETURN ファンクションから値を返す
NULL NOOP文(何もしない)/NULL値

③カーソル関連

予約語 用途
CURSOR カーソル宣言
OPEN カーソルを開く
FETCH カーソルから行取得
CLOSE カーソルを閉じる
INTO FETCH/SELECTの格納先
BULK COLLECT 一括FETCH
FORALL バルクDML
FOR UPDATE 行ロック取得
WHERE CURRENT OF 現在カーソル行を対象
LIMIT BULK COLLECT件数制限
SKIP LOCKED ロック中行スキップ
NOWAIT ロック競合時即エラー

④データ型

予約語 用途
NUMBER 数値型
VARCHAR2 / CHAR / NCHAR / NVARCHAR2 文字列型
DATE 日付型(変数名NG)
TIMESTAMP ミリ秒精度日時
INTERVAL 期間型
BOOLEAN 真偽型(PL/SQL専用)
PLS_INTEGER / BINARY_INTEGER 高速整数
BINARY_FLOAT / BINARY_DOUBLE IEEE 754浮動小数
SIMPLE_INTEGER オーバーフロー検査なし整数
CLOB / BLOB / NCLOB / BFILE LOB型
RAW / LONG / LONG RAW バイナリ/長い型
ROWID / UROWID 行ID型
RECORD レコード型定義
TABLE / VARRAY コレクション型
SUBTYPE サブタイプ定義
REF CURSOR / SYS_REFCURSOR カーソル変数
%TYPE / %ROWTYPE 型属性継承

⑤論理演算・比較

予約語 用途
AND / OR / NOT 論理演算
TRUE / FALSE / NULL 真偽/NULL
IN / NOT IN 値のリスト比較
BETWEEN / NOT BETWEEN 範囲比較
LIKE / NOT LIKE パターンマッチ
IS NULL / IS NOT NULL NULL比較
EXISTS / NOT EXISTS サブクエリ存在確認
ANY / ALL / SOME サブクエリ量化子

⑥DML(データ操作)

予約語 用途
SELECT データ取得
INSERT / VALUES データ挿入
UPDATE / SET データ更新
DELETE / FROM データ削除
MERGE / USING / MATCHED UPSERT
RETURNING / INTO DML結果取得
WITH 共通表式(CTE)

⑦DDL(定義操作)

予約語 用途
CREATE / OR REPLACE オブジェクト作成
ALTER / MODIFY 構造変更
DROP / PURGE 削除
RENAME 名前変更
TRUNCATE 全行削除
CONSTRAINT / CHECK / UNIQUE / PRIMARY KEY 制約定義
DEFAULT デフォルト値
INDEX / SEQUENCE / VIEW / SYNONYM オブジェクト種別
TABLESPACE / STORAGE 物理配置

⑧トランザクション

予約語 用途
COMMIT コミット
ROLLBACK ロールバック
SAVEPOINT セーブポイント
SET TRANSACTION トランザクション属性
LOCK TABLE テーブルロック
READ ONLY / READ WRITE 分離レベル
SERIALIZABLE 直列化レベル

⑨問い合わせ修飾

予約語 用途
WHERE / HAVING 条件指定
GROUP BY / ROLLUP / CUBE / GROUPING SETS グループ化
ORDER BY / ASC / DESC 並び替え
DISTINCT / UNIQUE 重複排除
UNION / UNION ALL / INTERSECT / MINUS 集合演算
JOIN / INNER / LEFT / RIGHT / FULL / OUTER / CROSS 結合
ON / USING 結合条件
LATERAL / CROSS APPLY / OUTER APPLY 横結合
CONNECT BY / START WITH / PRIOR 階層問い合わせ
MODEL MODEL句
PIVOT / UNPIVOT ピボット
OFFSET / FETCH FIRST / ROW_NUMBER ページング

⑩例外・コンパイラ指令

予約語 用途
EXCEPTION 例外ハンドラセクション
RAISE 例外発生
RAISE_APPLICATION_ERROR ユーザーエラー発生
WHEN OTHERS キャッチオール
SQLCODE / SQLERRM エラー情報関数
PRAGMA EXCEPTION_INIT ORAコード→例外名
PRAGMA AUTONOMOUS_TRANSACTION 自律トランザクション
PRAGMA SERIALLY_REUSABLE セッション間再利用
PRAGMA RESTRICT_REFERENCES 参照制約

⑪権限・セキュリティ

予約語 用途
GRANT 権限付与
REVOKE 権限取消
ROLE ロール定義
USER / PUBLIC ユーザー/全体
CONNECT / RESOURCE 基本ロール
ADMIN / GRANT OPTION 権限付与オプション
AUTHID CURRENT_USER / DEFINER プロシージャ実行者
SESSION / SYSTEM セッション/システム

実務で事故るTOP10予約語・キーワード

「うっかり使いたくなる」名前なのに予約語/キーワードだった、という実務で最頻出の10単語を集めました。

TOP10 予約語と安全な代替名
① DATE    → v_date, order_date, created_dt
② COUNT   → v_count, total_count, row_cnt
③ LEVEL   → v_level, depth, priority_level
④ TYPE    → v_type, record_type, kind
⑤ NAME    → v_name, full_name, display_name
⑥ NUMBER  → v_number, order_number, no
⑦ ROWNUM  → v_rownum, seq_no
⑧ TIMESTAMP → v_ts, updated_ts
⑨ VALUE   → v_value, attr_value
⑩ SIZE    → v_size, dimension

TOP10の詳細解説

予約語 特殊な意味 事故パターン
DATE 日付データ型 変数名/列名で衝突
COUNT 集計関数 SELECT内で関数呼び出し扱い
LEVEL CONNECT BY階層擬似列 CONNECT BY以外で参照不能
TYPE TYPE定義キーワード RECORD宣言と競合
NAME キーワード CREATE文などで構文エラー
NUMBER 数値データ型 型と識別子の曖昧さ
ROWNUM 擬似列 列名として使えない
TIMESTAMP 日時型 変数名で衝突
VALUE VALUES句で使われる 列名として混乱
SIZE ストレージキーワード DDL文で衝突
DATE列の事故例
-- ❌ テーブル列名に DATE を使うと引用符必須
CREATE TABLE events (
  id   NUMBER,
  date DATE       -- ORA-00904
);

-- ⭕ 意味のある列名に
CREATE TABLE events (
  id          NUMBER,
  event_date  DATE,      -- 具体的な意味を持つ名前
  created_at  TIMESTAMP,
  updated_at  TIMESTAMP
);

DATE/NAME/TYPE/COUNT は Oracle コードの No.1 事故源。これら4つは他言語/他DBでは普通に変数名になるため、Oracle初心者がほぼ必ず踏む罠。プロジェクト規約で「DATEで終わる列名/変数名は使わない、_dateまたは_atにする」と決めておくと衝突事故が激減します。

引用符囲み識別子:”ORDER”の罠

Oracleはダブルクォート("..."で囲むと予約語でも識別子にできますが、ケースセンシティブ(大小文字区別)になり様々な副作用が生まれます。基本的に避けるのが正解です。

引用符囲み識別子の挙動
-- ❌ 引用符で予約語を使う(非推奨)
CREATE TABLE orders (
  id     NUMBER,
  "DATE" DATE,             -- 引用符必須になる
  "ORDER" VARCHAR2(10)
);

-- 以降も常に引用符が必要
SELECT "DATE", "ORDER" FROM orders;  -- 引用符無しはエラー

-- 大小文字区別の罠
CREATE TABLE t (
  "Name"   VARCHAR2(100),  -- 登録名は Name(PascalCase)
  "name"   VARCHAR2(100)   -- 別列として共存可能
);

SELECT name FROM t;        -- Oracleは大文字化してNAMEを探す→ORA-00904
SELECT "Name" FROM t;      -- これなら動く

引用符識別子の3つのデメリット

①ケースセンシティブの強制:一度"Name"で作ると、以降のSELECTでも必ず同じケースで引用符付き指定が必要。通常のname指定(Oracleが大文字化してNAMEを探す)では見つからない。

②ツール互換性の問題:ORM/マイグレーションツール/BI ツールが引用符識別子を正しく扱えずエラーを出すことがある。GUI ツールでテーブル操作できない場合も。

③保守性が著しく低下:他の開発者がDATE列の存在を知らずSELECT date FROM tと書いて毎回エラー。チームメンバー全員が規約を知らないと混乱が広がる。

それでも既存DBで引用符列を触る必要がある時
-- 既存 "User Name" 列を扱う(レガシーDB対応)
DECLARE
  v_name VARCHAR2(100);
BEGIN
  SELECT "User Name" INTO v_name
  FROM legacy_users
  WHERE id = 1;

  UPDATE legacy_users
  SET "User Name" = 'New Name'
  WHERE id = 1;
END;

予約語誤用時のエラーメッセージ集

代表的なコンパイルエラー
-- ①PLS-00103: 識別子 "BEGIN" が必要
DECLARE
  begin NUMBER;    -- 予約語を変数名に
BEGIN
  NULL;
END;
-- Error at line 2: PLS-00103

-- ②ORA-00904: 無効な識別子
SELECT date FROM events;  -- date列は引用符必須
-- ORA-00904: "DATE": invalid identifier

-- ③ORA-00936: 式がありません
SELECT FROM users;  -- 列指定忘れ or 予約語衝突

-- ④PLS-00201: 識別子を宣言してください
DECLARE
  v_name VARCHAR2(100);
BEGIN
  username := 'taro';  -- 宣言していない識別子
END;

-- ⑤ORA-00957: 列名が重複
CREATE TABLE t (
  id NUMBER,
  id NUMBER  -- 重複(予約語との衝突でも発生しうる)
);

-- ⑥ORA-00942: 表またはビューが存在しません
SELECT * FROM "ORDER";  -- 大小文字違いで別名扱い
-- 実際は ORDER テーブル(大文字)で登録されているが引用符で小文字指定している

エラーメッセージの読み方のコツ:PLS-XXXXXはPL/SQLコンパイル時エラー、②ORA-XXXXXはSQL実行時エラー、③“XXXが必要” は予約語誤用の可能性、④“invalid identifier” はカラム名/変数名のタイポか予約語衝突、⑤行番号はUSER_ERRORSビューで詳細確認可能。

変数名・識別子の命名規則

安全な命名規則

プレフィックスで予約語衝突を回避
-- ⭕ プロジェクト標準の命名規則
DECLARE
  -- 変数(Variable):v_
  v_count        NUMBER;
  v_user_name    VARCHAR2(100);
  v_order_date   DATE;

  -- パラメータ(Parameter):p_
  PROCEDURE update_user(
    p_id      NUMBER,
    p_status  VARCHAR2
  ) IS ...

  -- 定数(Constant):c_
  c_tax_rate     CONSTANT NUMBER := 0.10;
  c_max_retry    CONSTANT NUMBER := 3;

  -- 例外(Exception):e_
  e_not_found    EXCEPTION;
  e_invalid      EXCEPTION;

  -- 型(Type):t_
  TYPE t_ids     IS TABLE OF NUMBER;
  TYPE t_user    IS RECORD (...);

  -- カーソル(Cursor):cur_
  CURSOR cur_active_users IS
    SELECT id, email FROM users WHERE status = 'active';

  -- グローバル変数(Global、パッケージ):g_
  g_session_id   VARCHAR2(100);
  g_debug_mode   BOOLEAN := FALSE;
BEGIN
  NULL;
END;

命名規則ベストプラクティス

全ての変数・パラメータにプレフィックスv_p_等)を付ける、②列名との衝突を防ぐWHERE id = p_idのように識別)、③意味のある名前v_xよりv_user_count)、④スネークケースv_user_count)がOracle業界標準、⑤最大30文字(12cR2未満)または128文字(12cR2+)制限に注意、⑥ASCII英数字+アンダースコアのみ(多バイト文字や記号は引用符必須になる)。詳細は【PL/SQL】変数・定数完全ガイドの命名規則セクション参照。

レガシーテーブルに予約語列がある時の対処

既に稼働している業務システムで、過去の設計者がDATETYPEを列名に使ってしまった場合の現実的な対処法です。

段階的な対処フロー
-- ①現在のスキーマ確認
SELECT column_name FROM user_tab_columns
WHERE table_name = 'ORDERS'
ORDER BY column_id;

-- ② 予約語列の使用は引用符で
SELECT id, "DATE", "TYPE" FROM orders;

-- ③ PL/SQL変数に取り込む時は%TYPEで型継承
DECLARE
  v_date orders."DATE"%TYPE;
  v_type orders."TYPE"%TYPE;
BEGIN
  SELECT "DATE", "TYPE" INTO v_date, v_type
  FROM orders WHERE id = 1;
END;

-- ④ 可能ならビューで別名を付けて上位アプリから隠す
CREATE OR REPLACE VIEW v_orders AS
SELECT
  id,
  "DATE"  AS event_date,
  "TYPE"  AS event_type
FROM orders;

-- 以降、v_ordersを使えば予約語に触れない
SELECT event_date, event_type FROM v_orders WHERE id = 1;

-- ⑤ 最終解:リネーム(サービス停止で計画)
ALTER TABLE orders RENAME COLUMN "DATE" TO event_date;
ALTER TABLE orders RENAME COLUMN "TYPE" TO event_type;

ビューで予約語を隠蔽するメリット

  • 上位アプリは引用符なしのクリーンな列名でアクセスできる
  • 将来の物理リネームへの移行が容易(ビュー定義だけ書き換えればOK)
  • 既存システムを壊さず段階的に移行
  • ORM(Hibernate/MyBatis/Entity Framework等)との互換性向上

2026年版ベストプラクティスチェックリスト

チェック項目 根拠・効果
変数はv_、パラメータはp_、定数はc_を必ず付与 予約語衝突ゼロ・列名衝突ゼロ
列名は_date_atで終わらせる(DATE単独NG) 予約語衝突+意味明確化
列名は_type_nameのような複合名に(単独NG) 具体性UP
引用符囲み識別子("...")は絶対禁止 ケースセンシティブで混乱・ツール非互換
V$RESERVED_WORDSをプロジェクトで共有 新人教育・レビュー基準
テーブル名はスネークケース+複数形(usersorder_items 一貫性・予約語回避
30文字以下(12cR1以前)/128文字以下(12cR2+)の制限を守る ORA-00972回避
数字・ASCII英字・アンダースコアのみ使用 引用符不要・可搬性
列名先頭は英字(数字NG) SQL仕様準拠
コードレビューで予約語チェックを必ず実施 チーム全体の品質底上げ

よくある質問

Q予約語の全リストはどこで確認できる?
AOracle 10g以降はV$RESERVED_WORDSビューで確認できます。SELECT keyword, length, reserved, res_type FROM V$RESERVED_WORDS ORDER BY keyword;で予約語属性付きの完全リストが取得できます。公式ドキュメント「Oracle Database SQL Language Reference」の「Oracle SQL Reserved Words」章でも確認可能。PL/SQL特有の予約語は「Oracle Database PL/SQL Language Reference」を参照してください。
Q予約語を変数名に使うとどうなる?
APLS-00103などのコンパイルエラーが出ます。例:DECLARE date DATE; BEGIN date := SYSDATE; END;PLS-00103: Encountered the symbol "DATE"でコンパイル失敗。解決策はv_dateのようにプレフィックスを付けるか、意味のある別名(order_date)に変更。
QDATEやCOUNTなどのキーワードは列名に使える?
A厳密には使えますが非推奨。引用符で囲めば"DATE" DATE, "COUNT" NUMBERのように定義可能ですが、以降常に引用符が必要になり可読性と保守性が大きく下がります。event_datetotal_countのように意味を明確にした複合名にするのがベストプラクティス。
Qv_dateやp_idのプレフィックス命名規則は業界標準?
Aはい、Oracle PL/SQL業界で広く使われている標準です。Steven Feuerstein(PL/SQL界の第一人者)も推奨しており、ApexOracle FormsEBS等のオラクル純正製品のソースコードも同様の命名規則を採用。チーム内で統一すればレビュー効率と保守性が大きく向上します。
Q引用符囲み識別子を使うとどう変わる?
Aケースセンシティブ強制"Name""name"は別)、②毎回引用符必須(SQL文・PL/SQL内で引用符忘れるとエラー)、③ORM/ツール互換性問題(一部ツールが引用符識別子を扱えない)、④可搬性低下(他DB移行時に書き換え大量発生)。実務では絶対に使わないのが正解です。
Q識別子の最大文字数は?
AOracle 12cR2以降は128バイトまで、それ以前は30バイトまで。日本語を含む場合はUTF-8で1文字3バイトなので、30バイト制限下では日本語10文字までしか使えません。現代のプロジェクトでは12cR2以降が多いので128バイト制限が基本ですが、レガシー互換性を考慮するなら30バイト以下に抑えるのが安全。
Q識別子に日本語を使っても動く?
A技術的には可能ですが強く非推奨。Oracleは日本語識別子を許可していますが、引用符必須"ユーザーID")、ツール/ORM/クラウド移行での互換性問題が山積み。識別子はASCII英数字+アンダースコアのみが国際標準です。
QSUBSTRやSYSDATEのような標準関数名を変数名にできる?
A技術的には可能ですが絶対に避けるべきDECLARE sysdate NUMBER; BEGIN sysdate := 10; ... END;のようにすると、そのスコープ内で標準関数SYSDATEが隠蔽されバグの温床になります。v_sysdatecurrent_timeのように別名を使いましょう。
Qパッケージ名が予約語になっていないか心配
AV$RESERVED_WORDSと照合するのが確実ですが、一般的なプレフィックス(pkg_を付ければ衝突しません。例:pkg_user_servicepkg_order_queue。Oracle純正パッケージはDBMS_UTL_プレフィックスを使うので、ユーザーコードはpkg_で区別するのが実務慣行。
Qテーブル名に_(アンダースコア)で始まる名前は使える?
A技術的に可能ですが非推奨。SQL標準では識別子は英字で始まるとされており、SQLクライアントによっては予約語/エラーとして扱われることがあります。データディクショナリでも_で始まる名前はOracle内部用途と衝突の恐れ。必ず英字で始めるのが安全。
Q予約語リストはOracleバージョンで変わる?
Aはい、新バージョンで新予約語が追加されます。例:JSON_TABLE(12.1)、MATCH_RECOGNIZE(12.1)、LATERAL(12.1)、BLOCKCHAIN(21c)など。既存コードがアップグレードで予約語衝突することがあるため、V$RESERVED_WORDSでバージョンごとに確認するのが確実です。
QSELECTで書いた列が “invalid identifier” と出る
A原因は①列名のタイポ(単純な綴りミス)、②大小文字違い(引用符付きで作成された列を引用符なしで参照)、③予約語列で引用符忘れ、④スキーマ/テーブル名違い(他ユーザー所有で権限なし)。SELECT column_name FROM user_tab_columns WHERE table_name = 'ORDERS';で実際の列名を確認するのが第一歩。

関連記事

まとめ

  • PL/SQL予約語は500語以上V$RESERVED_WORDSビューで全件確認可能
  • 予約語(Reserved)/キーワード(Keyword)/非予約の3階層がある
  • カテゴリ別では11種:ブロック/制御/カーソル/データ型/論理演算/DML/DDL/トランザクション/問い合わせ/例外/権限
  • TOP10事故予約語:DATECOUNTLEVELTYPENAMENUMBERROWNUMTIMESTAMPVALUESIZE
  • 引用符囲み識別子("...")はケースセンシティブ強制+ツール非互換で実務では絶対禁止
  • 誤用時のエラー:PLS-00103ORA-00904ORA-00936
  • 命名規則:v_p_c_e_t_g_cur_pkg_プレフィックスで衝突回避
  • 列名は_date_at_typeで終わる複合名に
  • レガシー対処:ビューで別名付与→段階的にALTER TABLE RENAME COLUMN
  • 識別子はASCII英数字+アンダースコアのみ、128バイト以下(12cR2+)

PL/SQLの予約語は「なんとなく避けるもの」から「なぜ予約語なのか」「どう確認し・どう命名するか」まで理解することで、バグを未然に防ぎ、保守性の高いコードが書けます。本記事の11カテゴリリスト・TOP10事故予約語・ベストプラクティスチェックリストをプロジェクトのコーディング規約に組み込めば、予約語由来のバグは激減します。基本構文は基本構文ガイド、変数は変数・定数完全ガイド、例外は例外処理完全ガイドと組み合わせて活用してください。