通常,当 Oracle 比较不同的数据类型(例如 NUMBER 和 CHARACTER)时,会启动隐式转换,一切都很好(前提是可以转换数据。)例如,如果您有一个需要 CHARACTER 值的函数,但您传递给它一个 NUMBER ,一切都很好 - Oracle 只是将 NUMBER 转换为字符。
例如这样的函数:
create or replace function get_something(p_id VARCHAR2) return number ...
如果你用这个来调用它:
get_dno(10);
或这个:
get_dno('10');
在 SQL 中:
select * from some_table where numeric_column = '10' -- no problem.
您看到这种错误的一个常见地方是 CASE 语句中的返回值。例如,如果你有这样的事情,你会得到那个错误:
SQL> SELECT CASE WHEN 1 = 1 THEN '1' ELSE 2 END
2 FROM dual
3 ;
SELECT CASE WHEN 1 = 1 THEN '1' ELSE 2 END
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected CHAR got NUMBER
(第一个 WHEN 子句中的数据类型是它在随后的其他 WHEN/ELSE 子句中所期望的。)
但在您的情况下,WHEN 和 THEN 都返回计数 - 数据类型是一致的。所以,我认为你有一个红鲱鱼在那里。
正如 Alex 上面提到的,OPTION 是一个关键字,如果您尝试使用它作为列名创建一个表,Oracle 不同意:
SQL> create table dummy
2 (option varchar2(10)
3 );
(option varchar2(10)
*
ERROR at line 2:
ORA-00904: : invalid identifier
这有效:
SQL> create table dummy
2 (option_col varchar2(10)
3 );
Table created.
或者你可以用引号来做:
SQL> create table dummy
2 ("option" varchar2(10));
Table created.
但现在你正处于一个受伤的世界——从现在开始你需要引用:
SQL> select option from dummy;
select option from dummy
*
ERROR at line 1:
ORA-00936: missing expression
SQL> select d.option from dummy d;
select d.option from dummy d
*
ERROR at line 1:
ORA-01747: invalid user.table.column, table.column, or column specification
带引号:
SQL> select d."option" from dummy d;
no rows selected
因此,如果您的查询真的给了您“预期的 CHAR,得到了 NUMBER”,那么在我看来,好像有什么不对劲了。