Используйте Informix Object Interface для C ++ для хранимых процедур / функций без параметров - PullRequest
1 голос
/ 31 марта 2011

Все просто - есть ли способ использовать эту библиотеку для вызова хранимой процедуры или функции, которая возвращает более одного результата?Я знаю о ITRoutingManager, но, похоже, он возвращает только одно значение ..

Подробно, вот что я имею в виду:

CREATE FUNCTION test_out1( pin INT )
    RETURNING INT;

    DEFINE param INT;
    LET param = 321;

    RETURN param;

END FUNCTION;

Возвращает 321, я могу получитьзначение с ITValue и ITConversions.Так что это нормально.Но следующее не так:

CREATE FUNCTION test_out2( pin INT )
    RETURNING INT, INT;

    DEFINE param INT;
    LET param = 321;

    DEFINE param2 INT;
    LET param2 = 123;

    RETURN param, param2;

END FUNCTION;

Когда я делаю routine.GetRoutine( "function test_out2( int )" ), это нормально, так что никаких проблем с этим нет.Но посмотрите на это:

std::cout &lt&lt "Result type: " &lt&lt routine.ResultType()->Name() IsRow() ? "row, " : ", " )
        &lt&lt (routine.ResultType()->IsCollection() ? "collection, " : ", " )
        &lt&lt routine.ResultType()->Quality() &lt&lt "\n\n";

печатает integer, , , null, обратите внимание на целое число .. Почему, например, целое число, а не строка.И как получить 2 значения, возвращаемые функцией ?Еще один интересный факт - возвращаемое значение равно 0 (когда я конвертирую его в int, используя класс ITConversions), а не 123 или 321 ..

Должно бытьдалеко.Это специальная библиотека, написанная для серверов Informix разработчиками Informix, и было бы странно, если бы это было невозможно.

То же самое для функций, но я думаю, что там то же самое.


ПРИМЕЧАНИЕ: в общем случае нет параметров out для параметров / функций informix ( Informix: процедура с выходными параметрами? )

1 Ответ

1 голос
/ 31 марта 2011

Как вы заметили, Informix на самом деле не имеет параметров 'OUT'; возвращает значения.

В обычном ESQL / C список выходных значений обрабатывается симметрично со списком входных значений; Поэтому я ожидал бы сделать то же самое с этим кодом. Какой бы метод вы не использовали для передачи 2-х аргументов функции, вероятно, но это никоим образом не гарантируется, - это то, как вы получаете несколько возвращаемых значений.

В случае сомнений обращайтесь с ним так же, как с оператором SELECT, который возвращает несколько строк. То есть делают аналоги:

 PREPARE s FROM "EXECUTE PROCEDURE test_out2(?)";
 DECLARE c CURSOR FOR s;
 OPEN c USING :input_value;
 while (sqlca.sqlcode == 0)
 {
     FETCH c INTO :out_value1, :out_value2;
     if (sqlca.sqlcode != 0)
         break;
     ...use values...
 }
 CLOSE c;
 FREE c;
 FREE s;

Я бы рекомендовал использовать ODBC поверх OIC ++. Интерфейс OIC ++ построен поверх другой библиотеки, DMI, которая, в свою очередь, построена поверх другой библиотеки, которая обращается к СУБД - я забываю, основывается ли она на ESQL / C или ODBC, или на одной из базовых библиотек, на которых построена библиотека. , Использование unixODBC в качестве диспетчера драйверов и соответствующего драйвера ODBC имеет для меня больше смысла, чем использование OIC ++.


Я понятия не имею, как это выглядит в OIC ++; Я никогда не использовал это, но только сделал некоторое поверхностное обслуживание этого.

В целом, вам лучше не использовать OIC ++ для новой работы. Informix продолжает распространять его для обратной совместимости, а не для поощрения нового использования.

...