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

パッケージのカーソルからデータを選択し、印刷します

    パイプライン関数を定義しましたが、これはそれを呼び出す方法ではありません:

    SQL> begin
      2  Cursor_pkg_func.f_trans(5);
      3  end;
      4  /
    Cursor_pkg_func.f_trans(5);
    *
    ERROR at line 2:
    ORA-06550: line 2, column 1:
    PLS-00221: 'F_TRANS' is not a procedure or is undefined
    ORA-06550: line 2, column 1:
    PL/SQL: Statement ignored
    
    
    SQL> 
    

    TABLE()関数を使用する必要があります。ただし、コードのバグが見つかります:

    SQL>  select * from table(Cursor_pkg_func.f_trans(5))
      2   /
    
    SMITH
    SMITH
    SMITH
    ''''
    SMITH
    SMITH
    SMITH
    SMITH
    ERROR:
    ORA-00028: your session has been killed
    
    
    
    273660 rows selected.
    
    SQL> 
    

    別のセッションからそのセッションを強制終了する必要があることに注意してください。そうしないと、引き続き実行されます。それでは、関数を単純化して、その無意味な2番目のループを取り除きましょう....

    CREATE OR REPLACE PACKAGE BODY Cursor_pkg_func IS
        FUNCTION f_trans (p in number) RETURN outrecset PIPELINED IS
        out_rec outrec_typ;
        BEGIN
            OPEN Cursor_pkg.C1;
            LOOP
                FETCH Cursor_pkg.C1 INTO Cursor_pkg.row_emp;
                EXIT when Cursor_pkg.C1%NOTFOUND;
                out_rec.var_char2 := Cursor_pkg.row_emp.last_name;
                PIPE ROW(out_rec);
            END LOOP;
            CLOSE Cursor_pkg.C1;
         RETURN;
         END f_trans;
    END Cursor_pkg_func;
    /
    

    ....それならlo!

    SQL> select * from table(Cursor_pkg_func.f_trans(5))
      2  /
    
    VAR_CHAR2
    ------------------------------
    ADAMS
    JAMES
    MILLER
    SMITH
    
    SQL> 
    

    パイプライン関数を作成しました。どうしてそんなことをしました?これを行う必要がある理由は、SELECT文のFROM句で使用できるPL/SQL関数が必要だったためです。これは、パイプライン化された関数のユースケースです。したがって、呼び出しを匿名のPL/SQLブロックに入れることは実際には意味がありません。

    とにかく。

    ドキュメントをお読みください。それは非常に包括的で、オンラインで無料です。 PL / SQLリファレンスの関連セクションは、静的SQLの章です。 PL/SQLのSELECT文は常に必要があることは明らかです。 ある記述の変数にレコードをフェッチします。匿名PL/SQLブロックは、この点でストアドプロシージャとまったく同じです。 詳細




    1. mysqlクエリのjson_encodeは、いくつかの行のいくつかのnull列を返しますが、列はnullではありません

    2. MariaDBでのSTRCMP()のしくみ

    3. エラー1452:子行を追加または更新できません:外部キー制約が失敗します

    4. PostgreSQLの制約の問題