sql >> データベース >  >> RDS >> Oracle

Groovy OracleStoredProc-無効な列インデックス

    次のコードは、SYS_REFCURSORの変数を取得するのに役立ちます Oracle匿名ブロックから。

    いくつかの重要な詳細に焦点を当てる必要があります:

    1. クラスgroovy.sql.Sql 対応するOutParameterがありません CURSOR_PARAMETERとして手動で作成します それをsql.callに渡します 方法
    2. ブロックが{call DECLAREで始まることを考慮してください END }で終わります ENDの後にセミコロンなし。そうしないと、認識しにくいSQLExceptionが発生する可能性があります。 顔に。
    3. 疑問符? sqlString内 パラメータバインディングの場所です。バインディングは、parametersListから値を取得する自然な順序で行われます。 。
      • この例では、バインディングが1つしかないため、? 値をOUTとして扱うCURSOR_PARAMETERとバインドします 渡されたタイプのパラメータ;
    4. sql.callの後にクロージャに入るのは1つだけです およびResultSet rs カーソルの行を提供するmy_cur 匿名ブロックで宣言されています。
    5. sqlStringを簡略化できます SYS_REFCURSORを返す関数を使用する OUTを使用したプロシージャの代わりに パラメータ。したがって、次のようになります。"{call BEGIN ? := MY_FUNC(); END}" または"{? = call MY_FUNC()}"を呼び出す
    import groovy.sql.OutParameter
    import groovy.sql.Sql
    import oracle.jdbc.OracleTypes
    
    import java.sql.ResultSet
    
    def driver = 'oracle.jdbc.driver.OracleDriver'
    def sql = Sql.newInstance('jdbc:oracle:thin:@my-server:1521:XXX', 'usr', 'psw', driver)
    
    // special OutParameter for cursor type
    OutParameter CURSOR_PARAMETER = new OutParameter() {
        public int getType() {
            return OracleTypes.CURSOR;
        }
    };
    
    // look at some ceremonial wrappers around anonymous block
    String sqlString = """{call
        DECLARE
          my_cur SYS_REFCURSOR;
        BEGIN
            STORED_PROCEDURE_NAME(my_cur);
            ? := my_cur;
        END
    }
    """;
    
    // the order of elements matches the order of bindings
    def parametersList = [CURSOR_PARAMETER];
    
    
    // rs contains the result set of cursor my_cur
    sql.call(sqlString, parametersList) { ResultSet rs ->
      while (rs.next()) {
          println rs.getString("my_column")
      }
    };
    

    追伸そして、質問をありがとう。




    1. Oracle DB Server + APEX + ORDS + JasperReportsをゼロから(パート4)

    2. 特定のテーブルのMySQLエンジンタイプを確認するにはどうすればよいですか?

    3. 構造化クエリ言語–SQL学習の重要性

    4. ユニコーンレール用のデータベース接続プールが本当に必要ですか?