1

У меня есть таблица Студенты со следующей схемой:PL/SQL процедура - Список рекордов ввода

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

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

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

ответ

2

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

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

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

А вот для ассоциативных массивов, в частности: http://www.oracle-base.com/articles/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

+0

Но таблица может расширяться горизонтально в будущем, мне нужно что-то логически эквивалентное списку в Java. – TheLameProgrammer

+1

Если вы имеете в виду, что в таблице может быть больше столбцов, вы все равно можете использовать коллекцию Oracle. Коллекция будет сборкой записей. Определите свою запись, основанную на таблице STUDENTS% ROWTYPE, и она будет динамически изменяться по мере того, как делает ваша таблица. – Ollie

+0

См .: http://docstore.mik.ua/orelly/oracle/prog2/ch09_02.htm – Ollie

0
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; 
1

Вы можете создать тип для вашей пары 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.