2009-06-11 163 views
4

我想用存儲過程將各種用戶插入到Oracle數據庫中。用戶(表「用戶」)擁有,出生比如說,名字,姓氏和日期:Oracle:存儲過程的可變參數數量

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

存儲過程創建一個用戶是非常簡單的:

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; 

如果我想什麼創建一個存儲過程來插入一個變量(1或2或3等)數量的用戶?由於

另外,請注意,上面的代碼只是樣品,所以隨機不正確的位可能存在

回答

9

您可以使用一組記錄在同一時間插入多個用戶。試想一下:

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 

在這裏,我定義兩種數據類型:一類RECORD將包含數據,一個用戶和INDEX BY TABLE將包含多條記錄。現在,過程本身:

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 

你可以這樣調用這樣的過程:

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 
1

你可以通過用戶的數組的程序

type userType is record (
    name varchar2(100), 
... 
); 

type userList is table of userType index by binary_integer; 

procedure array_insert (p_userList in userList) is 
begin 
    for i in p_userList.first..p_userList.last 
     insert into users (username) values (p_userList(i)); 
end array_insert; 

不知道如果所有這些都是有效的PL/SQL,但理論是有聲的

+1

如果您的Oracle數據庫版本支持批量綁定,則首選的解決方案是FORALL循環使用,而不是用於循環。 – Rene 2009-06-11 10:42:16