1

私は scriptella を初めて使用し、これまでのところ非常に便利であることがわかりましたが、次の障害にぶつかっています。次のような MYSQL データベース内に既に存在する SQL プロシージャがあります。

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 からのものです。データなし。** SQL ストアド プロシージャの末尾に "SELECT 1" を追加すると、値が返され、このエラーが解消されます。

ERROR2 - 上記のコードは、OUT パラメータを一時的な SQL 変数として格納しようとしていますが、これは Scriptella では機能しません。
ドライバー例外: org.apache.commons.jexl2.JexlException: scriptella.driver.jexl.JexlConnection.run@80 トークン化に失敗しました

** ここでの @ 記号や一時変数の使用は好きではありません。

質問 Scriptella は、ストアド プロシージャの呼び出しと OUT パラメータの返しをサポートしていますか? 私はこれに対して多くの回避策/ハックを試みましたが、今日まで進歩していません.

4

1 に答える 1

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>
于 2014-11-04T00:09:56.157 に答える