全部產品
Search
文件中心

PolarDB:預存程序和函數參數

更新時間:Mar 13, 2025

使用預存程序和函數的一個重要方面是,能夠將資料從調用程式傳遞給預存程序或函數,並能夠從預存程序或函數接收回資料。這將通過使用參數來實現。

參數在預存程序或函數定義中聲明,在預存程序或函數名稱後面用圓括弧(())括起。在預存程序或函數定義中聲明的參數稱為形參。當調用預存程序或函數時,調用程式提供要在被調用程式處理中使用的實際資料,以及要接收被調用程式處理結果的變數。調用程式在調用預存程序或函數時提供的資料和變數稱為實參。

下面是形參聲明的常規格式。

(name [ IN | OUT | IN OUT ] data_type [ DEFAULT value ])
  • name是分配給形參的標識符。如果指定,IN定義用於接收輸入資料並將其儲存到預存程序或函數的參數。

  • IN參數也可初始化為預設值。如果指定,OUT定義用於從預存程序或函數返回資料的參數。如果指定,IN OUT允許參數既用於輸入也用於輸出。如果IN、OUT和IN OUT全都被省略,則參數的行為與預設情況下它定義為IN時的相同。無論參數是IN、OUT還是IN OUT,都統稱為參數模式。

  • data_type定義參數的資料類型。

  • value是在調用中未指定實參時,在被調用程式中分配給IN參數的預設值。

樣本

下面是一個採用參數的預存程序的樣本:

CREATE OR REPLACE PROCEDURE emp_query (
    p_deptno        IN     NUMBER,
    p_empno         IN OUT NUMBER,
    p_ename         IN OUT VARCHAR2,
    p_job           OUT    VARCHAR2,
    p_hiredate      OUT    DATE,
    p_sal           OUT    NUMBER
)
IS
BEGIN
    SELECT empno, ename, job, hiredate, sal
        INTO p_empno, p_ename, p_job, p_hiredate, p_sal
        FROM emp
        WHERE deptno = p_deptno
          AND (empno = p_empno
           OR  ename = UPPER(p_ename));
END;

在此樣本中,p_deptno是IN形參,p_empno和p_ename是IN OUT形參,p_job、p_hiredate和p_sal是OUT形參。

說明

在上一樣本中,沒有在VARCHAR2參數中指定最大長度,並且沒有在 NUMBER 參數中指定精度和小數位元。在參數聲明中指定長度、精度、小數位元或其他約束是非法的。這些約束自動從調用預存程序或函數時使用的實參繼承。

emp_query預存程序可由另一個程式調用,從而將實參傳遞給該程式。下面是調用emp_query的另一個SPL程式的樣本。

DECLARE
    v_deptno        NUMBER(2);
    v_empno         NUMBER(4);
    v_ename         VARCHAR2(10);
    v_job           VARCHAR2(9);
    v_hiredate      DATE;
    v_sal           NUMBER;
BEGIN
    v_deptno := 30;
    v_empno  := 7900;
    v_ename  := '';
    emp_query(v_deptno, v_empno, v_ename, v_job, v_hiredate, v_sal);
    DBMS_OUTPUT.PUT_LINE('Department : ' || v_deptno);
    DBMS_OUTPUT.PUT_LINE('Employee No: ' || v_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);
END;

在此樣本中,v_deptno、v_empno、v_ename、v_job、v_hiredate和v_sal是實參。

上一樣本的輸出如下所示:

Department : 30
Employee No: 7900
Name       : JAMES
Job        : CLERK
Hire Date  : 03-DEC-81
Salary     : 950