すべてのプロダクト
Search
ドキュメントセンター

PolarDB:変数宣言で % TYPEを使用する

最終更新日:May 30, 2024

このトピックでは、変数宣言で % TYPEを使用する方法について説明します。

概要

変数は、テーブルからの値をデータベースに格納するためにSPLプログラムで宣言されます。 テーブル列とSPL変数の互換性を確保するには、列と変数のデータ型が同じである必要があります。 列のデータ型を変更する場合は、対応するSPLプログラムの変数のデータ型を変更する必要があります。 column属性 % TYPEを使用できます。 この方法では、特定の列データ型を変数宣言としてエンコードする必要はありません。 ドット表記の修飾列名または以前に宣言された変数の名前は、% TYPEのプレフィックスとして指定する必要があります。 宣言する変数に, % typeというプレフィックスが付いた列または変数のデータ型が代入されます。 指定された列または変数のデータ型が変更された場合、新しいデータ型は変数に関連付けられます。 これにより、宣言を変更する必要がなくなります。

説明 % TYPE属性は、仮パラメーター宣言とともに使用することもできます。

構文

name { { table | view }.column | variable }% TYPE;

パラメーター

フィールド概要
name宣言される仮パラメーター、または変数に割り当てられている識別子。
columnテーブルまたはビュー内の列の名前。
variablenameで識別される変数の前に宣言された変数の名前。
説明 変数は、not NULL句、DEFAULT句、または: =代入演算子を使用して列で指定できる属性など、列の他の属性を継承しません。

例:

以下のストアドプロシージャでは、システムは、従業員番号を使用することによってempテーブルを照会し、従業員が属する部門の全従業員の平均給与を取得し、従業員の給与を部門の平均給与と比較する。

CREATE OR REPLACE PROCEDURE emp_sal_query (
    番号でp_empno
)
IS
    v_ename         VARCHAR2(10);
    v_job           VARCHAR2(9);
    v_hiredate      DATE;
    v_sal           NUMBER(7,2);
    v_deptno        NUMBER(2);
    v_avgsal番号 (7,2);
開始
    SELECT ename, job, hiredate, sal, deptno
        INTO v_ename, v_job, v_hiredate, v_sal, v_deptno
        empからどこempno = p_empno;
    DBMS_OUTPUT.PUT_LINE('Employee # : '| | p_empno);
    DBMS_OUTPUT.PUT_LINE('Name       : ' || v_ename);
    DBMS_OUTPUT.PUT_LINE('Job        : ' || v_job);
    DBMS_OUTPUT.PUT_LINE('Hire Date  : ' || v_hiredate);
    DBMS_OUTPUT.PUT_LINE('Salary     : ' || v_sal);
    DBMS_OUTPUT.PUT_LINE('Dept # : '| | v_deptno);

    SELECT AVG(sal) INTO v_avgsal
        emp WHEREからdeptno = v_deptno;
    IF v_sal > v_avgsal THEN
        DBMS_OUTPUT.PUT_LINE (「従業員」の給与は
            | | 'の部門平均 | | v_avgsal);
    ELSE
        DBMS_OUTPUT.PUT_LINE (「従業員」の給与は
            | | 'の部門平均 | | v_avgsal);
    エンドIF;
エンド; 

上記のストアドプロシージャは、次のコードブロックに示すように、別のモードで記述することもできます。 この方法では、ストアドプロシージャの宣言セクションでempテーブルのデータ型を明示的にエンコードする必要はありません。

CREATE OR REPLACE PROCEDURE emp_sal_query (
    p_empno IN emp.empno % TYPE
)
IS
    v_ename         emp.ename%TYPE;
    v_job           emp.job%TYPE;
    v_hiredate      emp.hiredate%TYPE;
    v_sal           emp.sal%TYPE;
    v_deptno        emp.deptno%TYPE;
    v_avgsal v_sal % タイプ;
開始
    SELECT ename, job, hiredate, sal, deptno
        INTO v_ename, v_job, v_hiredate, v_sal, v_deptno
        empからどこempno = p_empno;
    DBMS_OUTPUT.PUT_LINE('Employee # : '| | p_empno);
    DBMS_OUTPUT.PUT_LINE('Name       : ' || v_ename);
    DBMS_OUTPUT.PUT_LINE('Job        : ' || v_job);
    DBMS_OUTPUT.PUT_LINE('Hire Date  : ' || v_hiredate);
    DBMS_OUTPUT.PUT_LINE('Salary     : ' || v_sal);
    DBMS_OUTPUT.PUT_LINE('Dept # : '| | v_deptno);

    SELECT AVG(sal) INTO v_avgsal
        emp WHEREからdeptno = v_deptno;
    IF v_sal > v_avgsal THEN
        DBMS_OUTPUT.PUT_LINE (「従業員」の給与は
            | | 'の部門平均 | | v_avgsal);
    ELSE
        DBMS_OUTPUT.PUT_LINE (「従業員」の給与は
            | | 'の部門平均 | | v_avgsal);
    エンドIF;
エンド; 
説明
  • p_empnoは、% TYPEを使用して明示的に定義される仮パラメーターの例です。
  • v_avgsalは、% TYPEを使用してテーブル列ではなく別の変数を参照する方法を示しています。

サンプル結果:

EXEC emp_sal_query(7698);

従業員# : 7698
名前: ブレイク
仕事: マネージャー
レンタル日: 5月1日-81 00:00:00
給与: 2850.00
Dept # : 30
従業員の給与は部門平均の1566.67
を上回っています