Sûr. Il est facile de créer une fonction privée.
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;
La chose à surveiller est que la procédure privée et définitions fonction doit être les dernières déclarations dans le bloc declare
. Autrement dit, nous ne pouvons pas déclarer de variables entre une fonction privée et la clause begin
de la procédure externe.
Je ne vous ai pas montré comment implémenter une fonction privée qui insère une ligne dans une table. C'est parce que c'est une mauvaise façon de faire les choses. Il est plus efficace d'utiliser SQL dans un ensemble basé sur l'ensemble.
Vous ne dites pas d'où proviennent les paramètres, alors je vais faire quelque chose.
exemple travaillé
Cette procédure émule un processus ETL. Il prend des données d'une table de transfert et les transfère dans une collection PL/SQL. Il manipule ensuite les données chargées d'une certaine manière, puis utilise une instruction d'insertion en bloc pour placer les données dans la table cible.
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>
Notez que FORALL est une opération de jeu pas une boucle.
Quoi qu'il en soit, pour montrer qu'il fonctionne, je vais charger ces trois lignes ...
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>
modifier 2
Si vous voulez vraiment faire la fonction privée thang, alors vous pouvez passer une % ROWTYPE comme paramètre ....
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;
/
Ceci est la syntaxe de MySQL, donc il ne sera pas compilé sur Oracle. – APC