PL / SQL过程 - 作为输入的记录列表

时间:2011-12-19 09:40:48

标签: oracle stored-procedures plsql oracle11g stored-functions

我有一张桌子学生有以下架构:

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

我想创建一个存储过程,它将学生列表作为输入参数,列表中的每个项目都有sid和sname。

输入参数的类型是什么以及如何定义它?

3 个答案:

答案 0 :(得分: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

希望它有所帮助...

编辑:

如果要声明所有类型并在包中执行所有操作,则:

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

然后,您可以将学生集合类型与您的数据库一起使用,将学生数据集合传入和传出过程和函数。

使用oracle对象的文档位于:http://docs.oracle.com/cd/B19306_01/appdev.102/b14260/adobjint.htm

答案 1 :(得分: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作为过程参数的类型。您可以使用SQL INSERT语句在T_STUDENT类型的变量中插入值。

答案 2 :(得分: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;