SQL 语言中提供的 INSERT 命令还可以在 SPL 程序中使用。
在 SQL INSERT 命令中允许表达式时,可以使用 SPL 语言中的表达式。因此,SPL 变量和参数可用于向插入操作提供值。
以下是使用从调用程序传递的数据插入新员工的存储过程的示例。
CREATE OR REPLACE PROCEDURE emp_insert (
p_empno IN emp.empno%TYPE,
p_ename IN emp.ename%TYPE,
p_job IN emp.job%TYPE,
p_mgr IN emp.mgr%TYPE,
p_hiredate IN emp.hiredate%TYPE,
p_sal IN emp.sal%TYPE,
p_comm IN emp.comm%TYPE,
p_deptno IN emp.deptno%TYPE
)
IS
BEGIN
INSERT INTO emp VALUES (
p_empno,
p_ename,
p_job,
p_mgr,
p_hiredate,
p_sal,
p_comm,
p_deptno);
DBMS_OUTPUT.PUT_LINE('Added employee...');
DBMS_OUTPUT.PUT_LINE('Employee # : ' || p_empno);
DBMS_OUTPUT.PUT_LINE('Name : ' || p_ename);
DBMS_OUTPUT.PUT_LINE('Job : ' || p_job);
DBMS_OUTPUT.PUT_LINE('Manager : ' || p_mgr);
DBMS_OUTPUT.PUT_LINE('Hire Date : ' || p_hiredate);
DBMS_OUTPUT.PUT_LINE('Salary : ' || p_sal);
DBMS_OUTPUT.PUT_LINE('Commission : ' || p_comm);
DBMS_OUTPUT.PUT_LINE('Dept # : ' || p_deptno);
DBMS_OUTPUT.PUT_LINE('----------------------');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('OTHERS exception on INSERT of employee # '
|| p_empno);
DBMS_OUTPUT.PUT_LINE('SQLCODE : ' || SQLCODE);
DBMS_OUTPUT.PUT_LINE('SQLERRM : ' || SQLERRM);
END;
如果发生异常,会自动回滚存储过程中进行的所有数据库更改。在此示例中,具有 WHEN OTHERS 子句的 EXCEPTION 部分捕获所有异常。将显示两个变量。SQLCODE 是标识发生的特定异常的数字。SQLERRM 是解释错误的文本消息。
以下显示执行此存储过程时的输出。
EXEC emp_insert(9503,'PETERSON','ANALYST',7902,'31-MAR-05',5000,NULL,40);
Added employee...
Employee # : 9503
Name : PETERSON
Job : ANALYST
Manager : 7902
Hire Date : 31-MAR-05 00:00:00
Salary : 5000
Dept # : 40
----------------------
SELECT * FROM emp WHERE empno = 9503;
empno | ename | job | mgr | hiredate | sal | comm | deptno
-------+----------+---------+------+--------------------+---------+------+--------
9503 | PETERSON | ANALYST | 7902 | 31-MAR-05 00:00:00 | 5000.00 | | 40
(1 row)
说明 INSERT 命令可以包括在 FORALL 语句中。FORALL 语句允许单个 INSERT 命令插入来自一个或多个集合中提供的值的多行。