全部产品
Search
文档中心

PolarDB:Menggunakan %TYPE dalam deklarasi variabel

更新时间:Jul 02, 2025

Topik ini menjelaskan cara menggunakan %TYPE dalam deklarasi variabel.

Ikhtisar

Variabel dideklarasikan dalam program SPL untuk menyimpan nilai dari tabel di database. Untuk memastikan kompatibilitas antara kolom tabel dan variabel SPL, tipe data kolom dan variabel harus sama. Jika Anda mengubah tipe data kolom, Anda juga harus menyesuaikan tipe data variabel dalam program SPL yang sesuai. Anda dapat menggunakan atribut kolom %TYPE. Dengan pendekatan ini, tidak perlu secara eksplisit menentukan tipe data kolom tertentu sebagai bagian dari deklarasi variabel. Nama kolom yang memenuhi syarat dalam notasi titik atau nama variabel yang telah dideklarasikan sebelumnya harus ditentukan sebagai awalan %TYPE. Tipe data kolom atau variabel yang diawali dengan %TYPE akan diberikan kepada variabel yang dideklarasikan. Jika tipe data kolom atau variabel yang diberikan berubah, tipe data baru akan otomatis dikaitkan dengan variabel, sehingga menghilangkan kebutuhan untuk memodifikasi deklarasi.

Catatan Atribut %TYPE juga dapat digunakan dengan deklarasi parameter formal.

Sintaksis

nama { { tabel | tampilan }.kolom | variabel }%TYPE;

Parameter

BidangIkhtisar
namaParameter formal yang akan dideklarasikan, atau pengenal yang ditetapkan ke variabel.
kolomNama kolom dalam tabel atau dalam tampilan.
variabelNama variabel yang dideklarasikan sebelum variabel yang diidentifikasi oleh nama.
Catatan Variabel tidak mewarisi atribut lain dari kolom, seperti atribut yang ditentukan pada kolom melalui klausa NOT NULL, klausa DEFAULT, atau operator penugasan :=.

Contoh

Dalam prosedur tersimpan berikut, sistem meminta tabel emp menggunakan nomor karyawan, menghitung rata-rata gaji semua karyawan di departemen tempat karyawan tersebut bekerja, dan membandingkan gaji karyawan dengan rata-rata gaji departemen.

CREATE OR REPLACE PROCEDURE emp_sal_query (
    p_empno         IN NUMBER
)
IS
    v_ename         VARCHAR2(10);
    v_job           VARCHAR2(9);
    v_hiredate      DATE;
    v_sal           NUMBER(7,2);
    v_deptno        NUMBER(2);
    v_avgsal        NUMBER(7,2);
BEGIN
    SELECT ename, job, hiredate, sal, deptno
        INTO v_ename, v_job, v_hiredate, v_sal, v_deptno
        FROM emp WHERE 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
        FROM emp WHERE deptno = v_deptno;
    IF v_sal > v_avgsal THEN
        DBMS_OUTPUT.PUT_LINE('Gaji karyawan lebih dari '
            || 'rata-rata departemen ' || v_avgsal);
    ELSE
        DBMS_OUTPUT.PUT_LINE('Gaji karyawan tidak melebihi '
            || 'rata-rata departemen ' || v_avgsal);
    END IF;
END;

Prosedur tersimpan sebelumnya juga dapat ditulis dalam mode lain, seperti yang ditunjukkan dalam blok kode berikut. Dengan cara ini, Anda tidak perlu secara eksplisit menentukan tipe data tabel emp di bagian deklarasi prosedur tersimpan.

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%TYPE;
BEGIN
    SELECT ename, job, hiredate, sal, deptno
        INTO v_ename, v_job, v_hiredate, v_sal, v_deptno
        FROM emp WHERE 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
        FROM emp WHERE deptno = v_deptno;
    IF v_sal > v_avgsal THEN
        DBMS_OUTPUT.PUT_LINE('Gaji karyawan lebih dari '
            || 'rata-rata departemen ' || v_avgsal);
    ELSE
        DBMS_OUTPUT.PUT_LINE('Gaji karyawan tidak melebihi '
            || 'rata-rata departemen ' || v_avgsal);
    END IF;
END;
Catatan
  • p_empno adalah contoh parameter formal yang secara eksplisit didefinisikan menggunakan %TYPE.
  • v_avgsal menunjukkan cara menggunakan %TYPE untuk mereferensikan variabel lain alih-alih kolom tabel.

Hasil sampel:

EXEC emp_sal_query(7698);

Employee # : 7698
Name       : BLAKE
Job        : MANAGER
Hire Date  : 01-MAY-81 00:00:00
Salary     : 2850.00
Dept #     : 30
Gaji karyawan lebih dari rata-rata departemen 1566.67