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

Oracle PLSQL表の使用方法(連想配列または索引別表)

    OraclePLSQLテーブル

    • PLSQLテーブルは複合データ型です。
    • これらは、上限がないことを除いて配列と同じように動作し、常に拡張できます。
    • テーブルごとのインデックスとも呼ばれます
    • PLSQL表には2つの要素が含まれています

    (1)テーブルにインデックスを付けるBINARY_INTEGERデータ型の主キー。連続している必要はありません。コレクションは、現在存在しないインデックス値を使用して要素に値を割り当てることによって拡張されます。
    文字列値でインデックスを作成することもできます

    (2)テーブル要素ごとにインデックスを格納するスカラーまたはレコードデータ型の列

    テーブルタイプを定義および宣言する方法

    PL / SQL表を作成するには、2つのステップを実行します。最初にTABLEタイプを定義し、次にそのタイプのPL/SQL表を宣言します。構文を使用して、任意のブロック、サブプログラム、またはパッケージの宣言型部分でTABLEタイプを定義できます

    Syntax 
     TYPE table_type_name IS TABLE OF datatype [NOT NULL] INDEX BY BINARY_INTEGER;

    要素タイプがレコードタイプの場合、レコード内のすべてのフィールドには、CHAR、DATE、NUMBERなどのスカラーデータ型が必要です。

    要素タイプを指定するには、%TYPEを使用して、変数またはデータベース列のデータ型を指定できます

    DECLARE 
     TYPE DEPTTabTyp IS TABLE OF dept.dept_name%TYPE INDEX BY BINARY_INTEGER;

    TABLEタイプ定義にNOTNULL制約を追加して、そのタイプのPL/SQL表にNULLが格納されないようにすることができます。

    DECLARE 
     TYPE DEPTTabTyp IS TABLE OF dept.location%TYPE NOT NULL INDEX BY BINARY_INTEGER;

    %ROWTYPEを使用して要素タイプを指定することもできます。

    DECLARE 
     TYPE deptTabTyp IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER;

    ユーザー定義のRECORDタイプを使用して、要素タイプを指定します。

    DECLARE 
     TYPE emp_phonetyp IS RECORD
     (
     Stdcode      PLS_INTEGER,
     phn_number   PLS_INTEGER,
     extension    PLS_INTEGER
     );
     TYPE emp_contact IS TABLE OF emp_phonetyp INDEX BY BINARY_INTEGER;

    TABLEタイプを定義した後、そのタイプのPL/SQL表を宣言できます

    DECLARE   
     TYPE SalTabTyp IS TABLE OF emp.sal%TYPE 
     INDEX BY BINARY_INTEGER;
     TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE
     INDEX BY BINARY_INTEGER;
     sal_tab SalTabTyp;  -- declare PL/SQL table
     emp_tab EmpTabTyp;  -- declare another PL/SQL table

    PLSQL表の属性またはメソッド

    PL / SQL表には、属性EXISTS、COUNT、FIRST、LAST、PRIOR、NEXT、およびDELETEがあります。

    PL / SQL表が使いやすくなり、アプリケーションの保守が容易になります。

    plsql_table_name.attribute_name

    属性が存在し、PRIOR、NEXT、およびDELETEはパラメーターを取ります。各パラメーターは、BINARY_INTEGER値、またはそのデータ型に暗黙的に変換可能な値を生成する式である必要があります。

    DELETEは、ステートメントと呼ばれるプロシージャのように機能します。ただし、他のPL / SQL表属性は、式の一部として呼び出される関数のように機能します。

    Exists(n) テーブルにn番目の要素が存在する場合はtrueを返します
    カウント テーブル内の要素の数を返します
    最初と最後 FIRSTおよびLASTは、PL / SQL表の最初と最後(最小および最大)の索引番号を返します
    PRIOR( n は、インデックスの前にあるインデックス番号を返します n PL/SQL表内
    NEXT( n は、インデックスに続くインデックス番号を返します。 n
    削除 DELETEは、PL/SQL表からすべての要素を削除します。 DELETE( n nを削除します th要素。 nの場合 nullの場合、DELETE( n )何もしません。 DELETE( m n )範囲内のすべての要素を削除します m .. n mの場合 nより大きい または、 m またはn nullの場合、DELETE( m n )何もしません

    PL / SQL表を使用して、バルク・データをデータベース表に出し入れしたり、クライアント側のアプリケーションと格納されたサブプログラム間で移動したりします。

    PLSQL表にデータを取り込む方法

    単純なデータ型のテーブルは、次のように入力できます:

    <variable>(<integer>) := <value>;

    複雑なデータ型のテーブルでは、次のように列を個別に入力する必要があります:

    <variable>(<integer>).<column_name> := <value>;

    または、カーソルから:

    fetch <cursor_name> into <variable>(<integer>);
    Type emptabletype  is table of varchar2(10)
    Index by binary_integer;
    emp_table emptabletyp;
    emp_table (1) := ‘good’;
    emp_table (2) := ‘bad’’;

    他の3つの方法でもOracleデータをPL/SQLテーブルに取得できます

    a)SELECT INTOステートメントを使用すると、1行のデータを選択できます

    SELECT INTOステートメントを使用して、スカラー要素への列エントリを選択できます。または、行全体を選択してレコード要素にすることもできます。次の例では、データベース表deptから、PL/SQL表dept_tabの最初の要素によって格納されているレコードに行を選択します。

    DECLARE
    TYPE DeptTabTyp IS TABLE OF dept%ROWTYPE
    INDEX BY BINARY_INTEGER;
    dept_tab DeptTabTyp;
    BEGIN
    /* Select entire row into record stored by first element. */
    SELECT * INTO dept_tab(1) FROM dept WHERE deptno = 10;
    IF dept_tab(1).dname = 'ACCOUNTING' THEN ...
    ...
    END;

    b)FETCHステートメント

    FETCH文を使用すると、Oracleデータの列全体をスカラーのPL/SQL表にフェッチできます。

    または、Oracleデータのテーブル全体をレコードのPL/SQLテーブルにフェッチすることもできます。

    DECLARE
    TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE
    INDEX BY BINARY_INTEGER;
    emp_tab EmpTabTyp;
    i BINARY_INTEGER := 0;
    CURSOR c1 IS SELECT * FROM emp;
    BEGIN
    OPEN c1;
    LOOP
    i := i + 1;
    /* Fetch entire row into record stored by ith element. */
    FETCH c1 INTO emp_tab(i);
    EXIT WHEN c1%NOTFOUND;
    -- process data record
    END LOOP;
    CLOSE c1;
    END;

    c)カーソルのFORループを使用すると、複数の行をフェッチできます。

    DECLARE
    TYPE EnameTabTyp IS TABLE OF emp.ename%TYPE
    INDEX BY BINARY_INTEGER;
    TYPE SalTabTyp IS TABLE OF emp.sal%TYPE
    INDEX BY BINARY_INTEGER;
    ename_tab EnameTabTyp;
    sal_tab SalTabTyp;
    n BINARY_INTEGER := 0;
    BEGIN
    /* Fetch entire columns into PL/SQL tables. */
    FOR emp_rec IN (SELECT ename, sal FROM emp) LOOP
    n := n + 1;
    ename_tab(n) := emp_rec.ename;
    sal_tab(n) := emp_rec.sal;
    END LOOP;
    ...
    END;

    これらの他のPLSQL投稿を読む必要があります

    OraclePLSQLのブロック構造とタイプ
    OraclePLSQLレコード
    Oracleplsqlインタビューの質問
    Oraclesqlおよびplsqlのクイックチュートリアル


    1. HIPAA準拠のデータベースを維持することの重要性

    2. PythonMySQLコネクタ-fetchoneの使用時に未読の結果が見つかりました

    3. PostgreSQL用のGUIツール

    4. RACでのSYSパスワードの変更