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

pl / sql配列のフェッチ(パラメータとして)

    PL / SQLスコープ(つまりパッケージ内)で定義された連想配列を使用せず、代わりにSQLスコープで定義されたコレクションを使用してください。

    create or replace TYPE stringlist IS TABLE OF VARCHAR2(4000);
    /
    
    create or replace TYPE stringlist2 IS TABLE OF VARCHAR2(4000);
    /
    

    その場合、パッケージは次のとおりです。

    CREATE OR REPLACE PACKAGE mypackage
    AS
      PROCEDURE table_in_table_out(
        inputArray   IN  stringlist,
        outputArray  OUT stringlist2,
        resultString OUT VARCHAR2
      );
    END mypackage;
    /
    
    CREATE OR REPLACE PACKAGE BODY mypackage
    AS
      PROCEDURE table_in_table_out(
        inputArray   IN  stringlist,
        outputArray  OUT stringlist2,
        resultString OUT VARCHAR2
      )
      IS
        i BINARY_INTEGER;
      BEGIN
        IF inputArray IS NULL THEN
          RETURN;
        END IF;
        outputArray := stringlist2();
        IF inputArray IS EMPTY THEN
          RETURN;
        END IF;
    
        -- Handle sparse arrays
        i := inputArray.FIRST;
        LOOP
          outputArray.EXTEND;
          outputArray(outputArray.LAST) := inputArray(i);
          resultString := resultString || inputArray(i);
          EXIT WHEN i = inputArray.LAST; 
          i := inputArray.NEXT(i);
        END LOOP;
      END;
    END mypackage;
    /
    

    データベースでのテスト

    SET SERVEROUTPUT ON;
    
    DECLARE
      i stringList := StringList( 'A', 'C', 'F' );
      e stringlist2;
      s VARCHAR2(4000);
      n BINARY_INTEGER;
    BEGIN
      i.DELETE(2);
      n := i.FIRST;
      LOOP
        DBMS_OUTPUT.PUT_LINE( n || ': ' || i(n) );
        EXIT WHEN n = i.LAST;
        n := i.NEXT(n);
      END LOOP;
      mypackage.table_in_table_out( i, e, s );
      DBMS_OUTPUT.PUT_LINE( s );
      n := e.FIRST;
      LOOP
        DBMS_OUTPUT.PUT_LINE( n || ': ' || e(n) );
        EXIT WHEN n = e.LAST;
        n := e.NEXT(n);
      END LOOP;
    END;
    /
    

    Java

    try{
      Class.forName( "oracle.jdbc.OracleDriver" );
    
      Connection con = DriverManager.getConnection(
          "jdbc:oracle:thin:@localhost:1521:orcl",
          "username",
          "password"
      );
    
      OracleConnection oCon = (OracleConnection) con;
    
      OracleCallableStatement st = (OracleCallableStatement) con.prepareCall( "{ call mypackage.table_in_table_out( :chars, :ergs, :res )}" );
    
      ARRAY ia = oCon.createARRAY("STRINGLIST", new String[]{ "A", "C", "F"} );
      st.setARRAYAtName("chars", ia );
      st.registerOutParameter( 2, java.sql.Types.ARRAY, "VARCHAR2S_TABLE" );
      st.registerOutParameter( 3, java.sql.Types.VARCHAR );
    
      System.out.println( st.execute() );
      System.out.println( st.getString( 3 ) );
      String[] strs = (String[]) st.getARRAY(2).getArray();
    
      for ( String str : strs )
        System.out.println(str);
    
      st.close();
      con.close();
    } catch (ClassNotFoundException | SQLException ex) {
      System.out.println( ex.getMessage() );
      ex.printStackTrace();
    }
    


    1. mySQLエラー:#1248-すべての派生テーブルには独自のエイリアスが必要です

    2. Oracle SQL 自動生成 ID 主キー

    3. MySQLクエリ-COUNTのSUMを使用

    4. psycopg2-キーなし接続