Oracle: переменное число параметров хранимой процедуры - PullRequest
4 голосов
/ 11 июня 2009

Я хочу вставить различных пользователей в базу данных 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 и т. Д.) Числа пользователей? Спасибо

Также обратите внимание, что приведенный выше код приведен только для примера, поэтому могут присутствовать случайные неправильные биты

Ответы [ 2 ]

9 голосов
/ 11 июня 2009

Вы можете использовать массив записей, чтобы вставить несколько пользователей одновременно. Рассмотрим:

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 голос
/ 11 июня 2009

Вы можете передать массив пользователей в процедуру

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, но теория верна

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...