在使用存储过程和函数的过程中,很重要的一个功能就是应用程序向存储过程或者函数传递数值,并且从存储过程和函数中接收返回的数据。这个功能可以通过使用参数来完成。

参数是在存储过程或函数后面的括号中声明的。在存储过程或函数中定义的参数称为形式参数。当调用存储过程或者函数的时候, 应用程序向被调用的函数/存储过程提供实际数值,并且通过变量取得被调用的函数/存储过程的返回结果。当调用存储过程或函数时, 由调用它们的应用程序所提供的数值和变量称为实际参数。

下面是一个正式参数声明的格式:
(name [ IN | OUT | IN OUT ] data_type [ DEFAULT value ])

name是分配给形式参数的标识符。 如果指定了IN子句,参数就会接收输入数据供存储过程或函数使用。您可以使用缺省值来初始化输入参数。如果指定了OUT子句,那么参数将存储过程或函数中的执行结果返回到调用它们的应用程序中。如果指定了IN OUT子句,那么参数可以同时当作输入和输出参数。如果省略对IN、OUT和 IN OUT的指定,那么参数以缺省方式被指定为输入参数。参数的用途由 IN、OUT、IN OUT来确定。 data_type 定义了参数的数据类型。 如果在调用过程中没有为实际参数指定数值,那么将把参数value的值作为缺省值分配给输入参数。

下面是一个存储过程的示例,这个存储过程带有参数:
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是输入形式参数,p_empno和p_ename是IN OUT形式参数。p_job、p_hiredate和p_sal是输出形式参数。
说明 在前面的这个示例中,没有指定VARCHAR2类型参数的最大长度和NUMBER类型参数的数值范围和小数位数。在实际的参数声明中,不允许指定参数的长度、精度和数值范围或者其他限定条件。这些约束条件实际上是在调用存储过程或者函数时,从用到的实际参数上自动继承的。
其它应用程序调用可以存储过程emp_query,向它传送实际参数。下面是一个示例,演示了如何通过另一个SPL应用程序调用存储过程emp_query。
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