在ORACLE存储过程中使用数组 .

本文详细介绍了在PL/SQL中如何通过TYPE和TableofRecord实现数组操作,包括单维数组和多维数组的定义及使用方法,并通过示例展示了具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
在PL/SQL中是没有数组(Array)概念的。但是如果程序员想用Array的话,就得变通一下,用TYPE 和Table of Record来代替多维数组,一样挺好用的。
emp_type 就好象一个table 中的一条record 一样,里面有id, name,gender等。emp_type_array 象个table, 里面含有一条条这样的record (emp_type),就象多维数组一样。

--单维数组
DECLARE
TYPE emp_ssn_array IS TABLE OF NUMBER
INDEX BY BINARY_INTEGER;               --创建一个NUMBER类型的,以数值【BINARY_INTEGER】为标号的数组。

best_employees emp_ssn_array;
worst_employees emp_ssn_array;

BEGIN
best_employees(1) := '123456';
best_employees(2) := '888888';

worst_employees(1) := '222222';
worst_employees(2) := '666666';

FOR i IN 1..best_employees.count LOOP
DBMS_OUTPUT.PUT_LINE('i='|| i || ', best_employees= ' ||best_employees(i)
|| ', worst_employees= ' ||worst_employees(i));
END LOOP;

END;

--多维数组
DECLARE

TYPE emp_type IS RECORD
( emp_id employee_table.emp_id%TYPE,
emp_name employee_table.emp_name%TYPE,
emp_gender employee_table.emp_gender%TYPE );

TYPE emp_type_array IS TABLE OF emp_type INDEX BY BINARY_INTEGER;

emp_rec_array emp_type_array;
emp_rec emp_type;

BEGIN
emp_rec.emp_id := 300000000;
emp_rec.emp_name := 'Barbara';
emp_rec.emp_gender := 'Female';

emp_rec_array(1) := emp_rec;

emp_rec.emp_id := 300000008;
emp_rec.emp_name := 'Rick';
emp_rec.emp_gender := 'Male';

emp_rec_array(2) := emp_rec;

FOR i IN 1..emp_rec_array.count LOOP
DBMS_OUTPUT.PUT_LINE('i='||i
||', emp_id ='||emp_rec_array(i).emp_id
||', emp_name ='||emp_rec_array(i).emp_name
||', emp_gender = '||emp_rec_array(i).emp_gender);
END LOOP;

END;
用下面语句声明数组类型
type intarray is varry(30) of integer;

用下面语句声明一个数组变量
declare
A intarray;用下面语句声明数组类型
type intarray is varry(30) of integer;

用下面语句声明一个数组变量
declare
A intarray;用下面语句声明数组类型
type intarray is varry(30) of integer;

用下面语句声明一个数组变量
declare
A intarray;
======================================================
 oracle 存储 过程返回数组的方法:

  1.建立包


  create or replace package test is
  TYPE filename_array IS 
TABLE OF varchar2(1);
  filename filename_array;
  end test;

  2. 建立存储过程


  create or replace procedure test_array(v_cfjg out test.filename_array ) is
  begin DECLARE i number;
  D_cfjg dic_cfjg%rowTYPE;
  -- D_nr dic_cfjg%rowTYPE;
  
cursor c1 is SELECT * FROM dic_cfjg;
  BEGIN
  i:=0;
  v_cfjg := test.filename_array(); --数组初始化
  open c1;
  
LOOP fetch c1 into D_cfjg;
  EXIT WHEN c1%NOTFOUND ;
  i:=i+1;
  v_cfjg.EXTEND;
  -- DBMS_OUTPUT.PUT_LINE(TO_CHAR(D_cfjg.dm));
  v_cfjg(v_cfjg.count):=D_cfjg.dm;
  DBMS_OUTPUT.PUT_LINE(v_cfjg(v_cfjg.count));
  -- 
测试
  -- FETCH C1 INTO D_cfjg;
  -- EXIT WHEN c1%NOTFOUND ;
  END LOOP;
  end;
  EXCEPTION
  WHEN TOO_MANY_ROWS THEN
  DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS');
  WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(sqlerrm);
  end test_array;
来源: http://blog.youkuaiyun.com/dxcboy/article/details/5652403
### 使用数组类型作为输入参数在Oracle存储过程中的实现 为了在Oracle存储过程使用数组类型的输入参数,通常会采用嵌套表或VARRAY来定义PL/SQL集合类型。这些集合可以被当作数组一样处理,在调用存储过程时传递给它。 #### 定义自定义集合类型 首先需要创建一个用户定义的类型,这可以通过`CREATE TYPE`语句完成。下面是一个例子,展示了如何创建名为`number_array_type`的简单整数列表: ```sql CREATE OR REPLACE TYPE number_array_type AS TABLE OF NUMBER; / ``` 此命令建立了可变大小的一维数值型数据结构,可用于接收来自客户端应用程序的数据集[^4]。 #### 创建接受数组参数的存储过程 接着编写一个能够接收上述类型参数的存储过程。这里展示了一个简单的示例,该存储过程遍历传入的数字序列并打印每一个元素: ```plsql CREATE OR REPLACE PROCEDURE process_numbers(p_num_list IN number_array_type) IS BEGIN FOR i IN p_num_list.FIRST .. p_num_list.LAST LOOP DBMS_OUTPUT.PUT_LINE('Number: ' || TO_CHAR(p_num_list(i))); END LOOP; END; / ``` 当通过编程接口(如Java、C#等)向这个存储过程发送请求时,则需构建相应的对象实例化这种特定于数据库端的数组形式,并将其绑定到对应的占位符位置上进行调用[^1]。 对于.NET环境下的开发人员来说,如果想要利用像`ExecuteReader()`这样的方法执行带有复杂参数(比如这里的数组)的操作,可能还需要额外配置连接字符串以及设置合适的命令属性以支持批量操作等功能特性。 另外值得注意的是,在遇到异常情况时,应当捕获可能出现的各种错误状况以便更好地调试程序逻辑;此时就可以借助`SQLException`类所提供的成员函数获取详细的诊断信息了[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值