我有一个具有以下架构的学生表:
CREATE TABLE STUDENTS
(
SID VARCHAR2(10 BYTE) NOT NULL,
SNAME VARCHAR2(50 BYTE) NOT NULL, . . .
)
我想创建一个存储过程,它将学生列表作为输入参数,列表中的每个项目都将具有 sid 和 sname。
输入参数的类型是什么以及如何定义它?
我有一个具有以下架构的学生表:
CREATE TABLE STUDENTS
(
SID VARCHAR2(10 BYTE) NOT NULL,
SNAME VARCHAR2(50 BYTE) NOT NULL, . . .
)
我想创建一个存储过程,它将学生列表作为输入参数,列表中的每个项目都将具有 sid 和 sname。
输入参数的类型是什么以及如何定义它?
您可以传入 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
您可以为您的情侣 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 类型的变量中插入值。
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;