2013-12-03 2 views
1

Я новичок в scriptella и нашел, что он очень полезен до сих пор, но попал в следующий roadblock. У меня есть SQL-процедура, которая уже существует в базе данных MYSQL, похожей на следующую.Scriptella and (mysql) Сохраненные процедуры «OUT» Параметр

DELIMITER // 
CREATE PROCEDURE FOO(IN input_param INT, OUT output_param1 INT, OUT output_param2 INT) 
BEGIN 
     /* real FOO sets output_params (conditionally) based on input_param */ 
     /*  AND updates an internal table */ 
     SET output_param1 = 1; 
     SET output_param2 = 2; 
END// 
DELIMITER ; 

Я хотел бы призвать/вызвать эту процедуру внутри Scriptella, похожее на следующее:

<query connection-id="in"> 
     SELECT SomeColumn FROM SomeTable; 
     <query connection-id="out1"> 
      CALL FOO(SomeColumn, @OUT1, @OUT2); // ERROR1 exception from this line, see below 
      <script connection-id="jexl"> 
       etl.globals['OUT1'] = @OUT1;  // ERROR2 doesn't like "@" 
       etl.globals['OUT2'] = @OUT2; 
      </script> 
     </query> 
     <query connection-id="out2"> 
      INSERT INTO AnotherTable (col1, col2) 
       VALUES (${etl.globals['OUT1']}, ${etl.globals['OUT2']}); 
     </query> 
    </query>  

ERROR1 - Scriptella ожидает строку «CALL Foo (SomeColumn, @ OUT1, @ OUT2) ;» для возврата результата.
Исключение драйвера: java.sql.SQLException: ResultSet - это UPDATE. Нет данных. ** Если я добавлю «SELECT 1» в конец хранимой процедуры SQL, он вернет значение и устранит эту ошибку.

ERROR2 - код выше пытается сохранить параметры OUT в качестве временных переменных SQL, которые не работают в Scriptella.
Driver исключение: org.apache.commons.jexl2.JexlException: [email protected] лексический анализ не удался

** Это не нравится @ символы или использование временных переменные здесь.

ВОПРОСЫ Поддерживает ли Scriptella вызов хранимых процедур и возврат параметров OUT? Я пробовал несколько обходных решений/взломов для этого, но до сих пор не сделал никакого прогресса.

ответ

0

Следующий скрипт работает для меня на MySQL:

<!-- 
Example of calling the following procedure: 
CREATE PROCEDURE demoSp(IN inputParam VARCHAR(255), 
        INOUT inOutParam INT, OUT outParam VARCHAR(255)) 
BEGIN 
    DECLARE z INT; 
    SET z = inOutParam + 1; 
    SET inOutParam = z; 
    SET outParam = 'Out param'; 

    SELECT inputParam; 
    END 
// 
--> 

<!DOCTYPE etl SYSTEM "http://scriptella.javaforge.com/dtd/etl.dtd"> 
<etl> 
    <connection id="in" url="jdbc:mysql://localhost/test" user="root"/> 
    <connection id="out" driver="text"/> 

    <!-- Calling a stored procedure --> 
    <script connection-id="in"> 
     CALL demoSp('abc3', @a, @b); 
    </script> 
    <!-- Using output parameters --> 
    <query connection-id="in"> 
     select @a,@b; 
     <script connection-id="out"> 
      $1,$2 
     </script> 
    </query> 
    <!-- Calling a stored procedure and iterating resultset (if any) --> 
    <query connection-id="in"> 
     CALL demoSp('abc3', @a, @b); 
     <script connection-id="out"> 
      Row: $1 
     </script> 
    </query> 
</etl> 
Смежные вопросы