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
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
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With