ORA-00903: invalid table name
Cause: A table or cluster name is invalid or does not exist.
Also issued for invalid cluster name in ALTER/DROP CLUSTER.
Action: Check spelling. Valid name: starts with letter,
alphanumeric + $ _ # only, ≤30 chars, not reserved word.
$、_、#錯誤代碼:在 DDL 中使用綁定變數
-- 錯誤示範
CREATE OR REPLACE PROCEDURE ddlproc (
tablename VARCHAR2, colname VARCHAR2, coltype VARCHAR2
) AS
cursor1 INTEGER;
BEGIN
cursor1 := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cursor1, 'CREATE TABLE :x1 (:y1 :z1)', DBMS_SQL.V7);
DBMS_SQL.BIND_VARIABLE(cursor1, ':x1', tablename);
DBMS_SQL.BIND_VARIABLE(cursor1, ':y1', colname);
DBMS_SQL.BIND_VARIABLE(cursor1, ':z1', coltype);
DBMS_SQL.EXECUTE(cursor1);
DBMS_SQL.CLOSE_CURSOR(cursor1);
END;
/
EXEC ddlproc('MYTABLE', 'COL1', 'NUMBER');
-- ORA-00903: invalid table name
DBMS_SQL.PARSE 直接執行 DDL,**DDL 不支援綁定變數** 。綁定變數僅用於 DML(SELECT/INSERT/UPDATE/DELETE)。解析時 :x1 被視為字面字串,非合法表名。
CREATE OR REPLACE PROCEDURE ddlproc (
tablename VARCHAR2, cols VARCHAR2
) AS
cursor1 INTEGER;
BEGIN
cursor1 := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cursor1, 'CREATE TABLE ' || tablename || ' ( ' || cols || ' )', DBMS_SQL.NATIVE);
DBMS_SQL.CLOSE_CURSOR(cursor1);
END;
/
EXEC ddlproc('MYTABLE', 'COL1 NUMBER, COL2 VARCHAR2(10)');
-- 成功建立表
ERROR at line 1:
ORA-04098: trigger 'SYSTEM.LOG_ERRORS_TRIG' is invalid and failed re-validation
ORA-00903: invalid table name
SELECT TEXT FROM USER_TRIGGERS WHERE TRIGGER_NAME = 'LOG_ERRORS_TRIG';
SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME = '引用的表名';
ALTER TRIGGER LOG_ERRORS_TRIG COMPILE;
| 場景 | 典型原因 | 排查方法 |
|---|---|---|
| SQL*Plus 直接執行 | 表名拼寫錯、大小寫不匹配(雙引號)、Schema 前綴缺失 | DESC table_name / SELECT * FROM user_tables |
| PL/SQL 靜態 SQL | 編譯時表不存在、權限透過角色授予(PL/SQL 忽略角色權限) | 直接授予物件權限、確認表存在 |
| 動態 SQL (EXECUTE IMMEDIATE) | 拼接字串錯誤、單引號脫逸、變數為空 | DBMS_OUTPUT 列印最終 SQL 字串驗證 |
| 匯入/遷移腳本 | 目標 Schema 缺表、表名大小寫敏感(雙引號建立) | 檢查匯出日誌、確認目標 Schema 物件 |
SELECT * FROM user_tables WHERE table_name = UPPER('表名');SHOW USER; 或 SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') FROM DUAL;GRANT SELECT ON schema.table TO user;(非角色)SELECT * FROM user_synonyms WHERE synonym_name = '名稱';SELECT * FROM v$reserved_words WHERE keyword = UPPER('名稱');USER_ERRORSORA-00903 看似簡單,實則反映了命名規範、動態 SQL 正確用法、依賴管理等基本功。建立標準化開發部署流程可從根源消除此類錯誤。