2013-08-07 2 views
0

DB: Oracle 11gОжидаемое CHAR получил НОМЕР

Запрос:

SELECT CASE 
     WHEN rs.OPTION = '3' 
     THEN 
     (SELECT COUNT(DISTINCT ex.EXTS) AS TMPCOL0 
     FROM CRSIDM.SUB_OPTS ex 
     INNER JOIN CRSIDM.SUB_OPTS_GRP cg 
     ON cg.GROUP_ID = ex.GRP_ID   
     ) 
     ELSE 
     (SELECT COUNT(DISTINCT ex.EXTS) AS TMPCOL0 
     FROM CRSIDM.SUB_OPTS ex 
     INNER JOIN CRSIDM.SUB_OPTS_POL cg 
     ON cg.GROUP_ID = ex.GRP_ID 
     ) 
    END AS PROPTS 
    FROM PR_OPTS 

Я получаю ошибку 'ожидается CHAR получил номер', здесь EXTS, GROUP_ID & GRP_ID являются числовыми. Тогда как есть шанс ожидать CHAR?

+0

Является ли 'rs' псевдоним для' PR_OPTS', или есть соединение, которое вы не показываете? Каким типом данных является «ОПЦИЯ», и это заключено в двойные строчки в вашем фактическом коде, поскольку это [зарезервированное слово] (http://docs.oracle.com/cd/E11882_01/server.112/e26088/ap_keywd001 .htm), или действительно называли что-то еще? –

ответ

0

По существу, это означает, что некоторые из полей, которые вы используете, несовместимы друг с другом. Это в основном «несоответствие типа». Просто проверьте, используются ли какие-либо типы CHAR с типами NUMBER. Затем вы можете либо переключить тип одного, либо просто использовать преобразование как часть запроса.

0

Вопрос OPTION = '3', кавычки указывают, что вы ищете строку, содержащую одиночный символ 3.

Попробуйте вместо этого:

SELECT CASE 
    WHEN rs.OPTION = 3 
    THEN 
     (SELECT COUNT(DISTINCT ex.EXTS) AS TMPCOL0 
     FROM CRSIDM.SUB_OPTS ex 
     INNER JOIN CRSIDM.SUB_OPTS_GRP cg 
     ON cg.GROUP_ID = ex.GRP_ID) 
    ELSE 
     (SELECT COUNT(DISTINCT ex.EXTS) AS TMPCOL0 
     FROM CRSIDM.SUB_OPTS ex 
     INNER JOIN CRSIDM.SUB_OPTS_POL cg 
     ON cg.GROUP_ID = ex.GRP_ID) 
    END AS PROPTS 
FROM PR_OPTS 
1

В общем случае, когда Oracle сравнивает различные типы данных, такие как число с характером, неявные ногами преобразования в и все хорошо (при условии, что данные могут быть преобразованы.) Например, если у вас есть функция, которая ожидает значение CHARACTER, но вы передаете ей NUMBER, все хорошо - Oracle просто преобразует NUMBER в символ.

E.g. функция, как это:

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. 

Популярное где вы видите такую ​​ошибку с ретуром n значений в операциях 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 

(Тип данных от первого КОГДА пункт является то, что он ожидает, что в другом КОГДА/ELSE положения, которые следуют.)

Но в вашем случае КОГДА И ТОГДА оба возвращают счета - типы данных согласованы. Итак, я думаю, у вас там есть красная селедка.

Как Алекс уже упоминалось выше, ВАРИАНТ это ключевое слово, и если вы пытаетесь создать таблицу с этим именем столбца, 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. 

Но теперь вы находитесь в мире боли - вам нужны цитаты с этого времени o п:

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", он смотрит на меня как-то не горит.

Смежные вопросы