Процедура PL / SQL - список записей в качестве входных данных - PullRequest
1 голос
/ 19 декабря 2011

У меня есть таблица студентов со следующей схемой:

CREATE TABLE STUDENTS
(
    SID    VARCHAR2(10 BYTE)    NOT NULL,
    SNAME  VARCHAR2(50 BYTE)    NOT NULL, . . .
)

Я хочу создать хранимую процедуру, которая будет принимать список студентов в качестве входных аргументов, каждый элемент в списке будет иметь sid и sname.

Каким будет тип входного параметра и как его определить?

Ответы [ 3 ]

2 голосов
/ 19 декабря 2011

Вы можете передать тип коллекции Oracle в качестве параметра.

Коллекция может быть парой ключ-значение, такой как ассоциативный массив, проиндексированный varchar. В этом примере индексом может быть SID, а значением может быть SNAME.

Прочтите здесь, чтобы узнать о коллекциях: http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/05_colls.htm

А вот для ассоциативных массивов, в частности: http://www.oracle -base.com / article / 9i / AssociativeArrays9i.php

В качестве альтернативы вы можете передать два параметра: обе коллекции, содержащие значения varchar (например, типы DBMS_SQL.VARCHAR2_TABLE), первая содержит SID, а вторая содержит соответствующие значения SNAME, они будут эффективно связаны своим индексным номером. Смотрите здесь для определенных типов DBMS_SQL: http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sql.htm

Надеюсь, это поможет ...

EDIT:

Если вы объявляете все типы и выполняете все действия в пакете, то:

-- Declare type
TYPE student_coltype IS TABLE OF student%ROWTYPE
     INDEX BY BINARY_INTEGER;
-- Declare variable of type
student_col student_coltype;

Если вам нужны глобальные типы, вам придется явно объявить столбцы:

CREATE TYPE student_rec
AS OBJECT 
(SID   VARCHAR2(10),
 SNAME VARCHAR2(50));

CREATE TYPE student_collection
AS TABLE OF student_rec;

Затем вы можете использовать тип коллекции учащихся в вашей БД для передачи коллекций данных учащихся в процедуры и функции и из них.

Документы для использования объектов оракула здесь: http://docs.oracle.com/cd/B19306_01/appdev.102/b14260/adobjint.htm

1 голос
/ 19 декабря 2011

Вы можете создать тип для своей пары SID, SNAME:

CREATE OR REPLACE
TYPE O_STUDENT AS OBJECT (
  SID                           VARCHAR2(20)
, SNAME                         VARCHAR2(20)
);

Затем создайте тип коллекции:

CREATE OR REPLACE
TYPE T_STUDENT AS TABLE OF O_STUDENT;

Затем используйте T_STUDENT в качестве типа параметра вашей процедуры. Вы можете вставить значения в переменную типа T_STUDENT с помощью операторов SQL INSERT.

0 голосов
/ 19 декабря 2011
   create or replace procedure show_students is
    begin
      dbms_output.put_line('------------------------');     
      dbms_output.put_line('Student ID| Student Name|');
      dbms_output.put_line('------------------------');
      for i in( select * from students )
      loop
        dbms_output.put(i.sid||' |');
        dbms_output.put(i.sname||'        |');
      end loop;
      dbms_output.put_line('------------------------------');
    end;
    /
    show errors;
   set serveroutput on;
   execute show_students;
...