【问题标题】:PL/SQL Procedure - List of Records as InputPL/SQL 过程 - 作为输入的记录列表
【发布时间】:2012-01-23 11:18:11
【问题描述】:

我有一个具有以下架构的学生表:

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

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

输入参数的类型以及如何定义?

【问题讨论】:

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


    【解决方案1】:

    您可以传入一个 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

    【讨论】:

    • 但是以后表格可能会横向扩展,我需要一些逻辑上等价于Java中的List的东西。
    • 如果您的意思是表中可能有更多列,那么您仍然可以使用 Oracle 集合。该集合将是记录的集合。根据 STUDENTS 表 %ROWTYPE 定义您的记录,它会随着您的表动态变化。
    • 这是正确的吗? TYPE studentList IS VARRAY(100) OF students%ROWTYPE;
    • 这会创建一个 VARRAY,我个人会使用不同的类型(我会用一些语法编辑我的答案)
    【解决方案2】:

    您可以为您的情侣 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 类型的变量中插入值。

    【讨论】:

      【解决方案3】:
         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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-24
        相关资源
        最近更新 更多