Конечно.Создать личную функцию легко.
create or replace procedure p1 as
n pls_integer;
function private_f return number is
begin
return n;
end private_f;
begin
n := private_f;
end p1;
Следует обратить внимание на то, что частные процедуры и определения функций должны быть последними объявлениями в блоке declare
.То есть мы не можем объявить какие-либо переменные между закрытой функцией и предложением begin
внешней процедуры.
Я не показал вам, как реализовать закрытую функцию, которая вставляет строку в таблицу.Это потому, что это плохой способ делать вещи.Более эффективно использовать SQL на основе множеств.
Вы не говорите, откуда берутся параметры, поэтому я что-нибудь придумаю.
рабочий пример
Эта процедура эмулирует ETLпроцесс.Он берет некоторые данные из промежуточной таблицы и загружает их в коллекцию PL / SQL.Затем он каким-то образом манипулирует загруженными данными, а затем использует оператор массовой вставки для помещения данных в целевую таблицу.
SQL> create or replace procedure pop_emps
2 ( p_mgr in emp.mgr%type)
3 as
4 type emp_nt is table of emp%rowtype;
5 new_emps emp_nt;
6 begin
7 -- populate array from staging table
8 select emp_seq.nextval
9 , t.ename
10 , t.job
11 , p_mgr
12 , trunc(sysdate)
13 , t.sal
14 , null
15 , t.deptno
16 bulk collect into new_emps
17 from emp_import t;
18 -- fix some special values
19 for i in new_emps.first..new_emps.last
20 loop
21 if new_emps(i).deptno = 50
22 then
23 new_emps(i).job := 'PLUMBER';
24 new_emps(i).mgr := 8061;
25 end if;
26 end loop;
27 -- insert new rows into EMP table
28 forall j in new_emps.first..new_emps.last
29 insert into emp
30 values new_emps(j);
31 end pop_emps;
32 /
Procedure created.
SQL>
Обратите внимание, что FORALL - это заданная операция , а не цикл .
Во всяком случае, чтобы показать, как это работает, я загружу эти три строки ...
SQL> select * from emp_import
2 /
ENAME SAL DEPTNO JOB
-------------------- ---------- ---------- --------------------
KESTELYN 3500 30 MARKETING
LIRA 3750 30 MARKETING
TRICHLER 3500 50 MARKETING
SQL> exec pop_emps(7839)
PL/SQL procedure successfully completed.
SQL> select * from emp where hiredate = trunc(sysdate)
2 /
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
8083 KESTELYN MARKETING 7839 08-APR-10 3500 30
8084 LIRA MARKETING 7839 08-APR-10 3750 30
8085 TRICHLER PLUMBER 8061 08-APR-10 3500 50
SQL>
edit 2
Если вы действительно хотите сделатьприватная функция thang, тогда вы можете передать% ROWTYPE в качестве параметра ....
create or replace procedure pop_emps is
new_row emp%rowtype;
procedure pop_emp_row
( p_row in emp%rowtype)
is
begin
insert into emp
values p_row;
end pop_emp_row;
begin
-- assign some values to new_row
new_row.empno := emp_seq.nextval;
new_row.ename := 'WHOEVER';
new_row.hiredate := trunc(sysdate);
-- etc, etc
pop_emp_row(new_row);
end pop_emps;
/