Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Oracle: Variable number of parameters to a stored procedure

I want to INSERT various users into a Oracle db with a stored procedure. A user (table "user") has, say, name, surname and date of birth:

CREATE TABLE "USER" 
   (
   "Name" VARCHAR2(50),
   "Surname" VARCHAR2(50),
   "Dt_Birth" DATE,
   )

A stored procedure to create a user is pretty simple:

CREATE PROCEDURE Insert_User(p_user, p_surname, p_dt_birth)
BEGIN
 INSERT INTO User(Name, Surname, Dt_Birth) VALUES(p_user, p_surname, p_dt_birth);
END;

What if I want to create a stored procedure to insert a variable (1 or 2 or 3 etc) number of users? Thanks

Also, please note that the above code is just for sample, so random incorrect bits may be present

like image 229
pistacchio Avatar asked Dec 29 '22 22:12

pistacchio


1 Answers

You could use an array of records to insert several users at the same time. Consider:

SQL> CREATE TABLE "USER"    (
  2     "Name" VARCHAR2(50),
  3     "Surname" VARCHAR2(50),
  4     "Dt_Birth" DATE
  5  );

Table created
SQL> CREATE OR REPLACE PACKAGE user_pkg IS
  2  
  3     TYPE user_rec IS RECORD (
  4        name VARCHAR2(50),
  5        surname VARCHAR2(50),
  6        dt_birth DATE
  7     );
  8     TYPE user_tab IS TABLE OF user_rec INDEX BY BINARY_INTEGER;
  9  
 10     PROCEDURE insert_user(p_user user_tab);
 11  
 12  END user_pkg;
 13  /

Package created

Here I defined two datatypes: a RECORD type that will contain the data for one user and an INDEX BY TABLE that will contain several records. Now the procedure itself:

SQL> CREATE OR REPLACE PACKAGE BODY user_pkg IS
  2  
  3     PROCEDURE insert_user(p_user user_tab) IS
  4     BEGIN
  5        FOR i IN 1..p_user.count LOOP
  6           INSERT INTO "USER"("Name", "Surname", "Dt_Birth")
  7           VALUES (p_user(i).name,
  8                   p_user(i).surname,
  9                   p_user(i).dt_birth);
 10        END LOOP;
 11     END insert_user;
 12  
 13  END user_pkg;
 14  /

 Package body created

You would then call the procedure like this:

SQL> DECLARE
  2     l_user_tab user_pkg.user_tab;
  3  BEGIN
  4     SELECT owner, object_name, created
  5       BULK COLLECT INTO l_user_tab
  6       FROM all_objects
  7      WHERE ROWNUM <= 3;
  8     user_pkg.insert_user(l_user_tab);
  9  END;
 10  /

SQL> SELECT * FROM "USER";

Name    Surname  Dt_Birth
------- -------- -----------
SYS     IND$     12/05/2000
SYS     ICOL$    12/05/2000
SYS     OBJ$     12/05/2000
like image 90
Vincent Malgrat Avatar answered Jan 13 '23 22:01

Vincent Malgrat