Pro*C возвращает не число в предложении IN

Я пытаюсь запустить SQL из своего кода C, используя Pro * c. Это мой SQL

EXEC SQL select count(1) from MY_TABLE where id IN ( :format );

id — это ЧИСЛО (10), а формат — это массив символов, содержащий значения 1,2,3,4,5.

Это возвращает ошибку с «Не числом». Однако, если массив формата представляет собой просто одно число, он работает нормально. Пожалуйста, дайте мне знать, если кто-то найдет ошибку.

Спасибо!


person rahul    schedule 26.06.2014    source источник
comment
Предложение IN не поддерживает переменную привязки таким образом. В Pro*C вам может понадобиться сформировать строку запроса с жестко закодированными значениями или попробовать это   -  person Maheswaran Ravisankar    schedule 26.06.2014
comment
подумайте о добавлении списка аргументов для оператора IN. Не нужно жестко кодировать это в SQL, просто добавьте (:form1, :form2,...)   -  person ik_zelf    schedule 27.06.2014
comment
@OracleUser: пожалуйста, добавьте это как комментарий, чтобы я мог пометить его как ответ.   -  person rahul    schedule 28.06.2014


Ответы (2)


Предложение IN принимает переменные связывания только как (:1,:2,:3) , поэтому вы заранее знаете количество переменных связывания. Что вряд ли.

Самый простой способ — сформировать динамическую строку запроса с жестко закодированными значениями в Pro*C.

Существуют альтернативные решения от AsKTom и Мой ответ SO

person Maheswaran Ravisankar    schedule 30.06.2014

    for(i=0;i<5;i++)
    {
        EXEC SQL select count(1) from MY_TABLE where id IN ( :format[i] );
    }

Я предлагаю использовать приведенный выше код, так как он слишком паршивый, просто объясняю, как работают массивы в Pro*C. Вы должны указать индекс массива.

Изменить: я узнал новую вещь для этой проблемы: - Мы также можем использовать

    EXEC SQL FOR 5
        SELECT COUNT(1) FROM MY_TABLE WHERE id IN (:format);

   EXEC SQL SELECT COUNT(1) FROM MY_TABLE WHERE id IN 
             (:format[0],:format[1],:format[2],:format[3],:format[4])
person Singh Gaurav    schedule 16.06.2016