2009-06-11 583 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