重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
一、如果定义数组的同时,赋予初值,那么可以省略数组的个数申明,编译系统自动计算你的初始化元素个数来确定数组大小。
成都创新互联公司专注于班戈网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供班戈营销型网站建设,班戈网站制作、班戈网页设计、班戈网站官网定制、微信平台小程序开发服务,打造班戈网络公司原创品牌,更为您提供班戈网站排名全网营销落地服务。
二、我上面用词是“可以”,那么也可以指明数组的大小,当然指定的大小一定要比初始化元素个数多才行。
三、如果没有初始化,比如仅仅是“char
a[8];”,那么一定要指明大小,否则系统不知道分配多少空间。
以上说明是针对C语言而言的,如果是对于JAVA、PHP、PERL等语言,其数组大小是动态可以调的,也就是说都可以不指定,或者指定一个很小的,以后使用中会自动扩充。
可以!
1、先定义用户类型:
create or replace type Va as varray(10) of char(5);
定义Va为十个元素是char(5)类型
2、再定义进表中:
create table photo (
id varchar2(2),
address varchar2(10),
My_va Va);
定义比如:TYPE test IS TABLE OF VARCHAR2(100) INDEX BY PLS_INTEGER;
用就直接:test(1):=3;就行
作用:就是类似程序语言中的数组
1. 存储过程以及类型定义如下:
--The array in oracle
CREATE OR REPLACE TYPE idArray AS TABLE OF VARCHAR2(20);
--package header
CREATE OR REPLACE PACKAGE Lib_Package AS
PROCEDURE Book_Check_Procedure(ids IN idArray, exist OUT NUMBER);
END Lib_Package;
--package body
CREATE OR REPLACE PACKAGE BODY Lib_Package AS
PROCEDURE Book_Check_Procedure( ids IN idArray, exist OUT NUMBER) AS v_Index BINARY_INTEGER; BEGIN v_Index:= ids.FIRST; LOOP SELECT COUNT(*) INTO exist FROM Lib_Duplicate WHERE status='Lent' AND book_id=ids(v_Index); EXIT WHEN v_Index=ids.LAST OR exist0; v_Index:= ids.NEXT(v_Index); END LOOP;END Book_Check_Procedure;
END Lib_Package;
2.在Java中调用上面的存储过程
(1) 在Oracle中定义数组类型idArray (2) 在java构造数组并转换成Oracle中定义的数组类型,调用存储过程
/** * 当要删除图书时,检查是否仍然有图书复本处于借出状态 */ public boolean checkBookStatus(String[] bookIds) throws DataAccessException {
boolean flag = false; Connection conn = null; OracleCallableStatement cstmt = null; ArrayDescriptor desc = null; ARRAY bookIdArray = null; int count = 0; String sql = "{call LIB_PACKAGE.Book_Check_Procedure(?,?)}";
DbDriverManager dbManager = DbDriverManager.getInstance(); conn = dbManager.getConnection(Constants.DATABASE);
try { cstmt = (OracleCallableStatement) conn.prepareCall(sql);
//定义oracle中的数组类型 desc = ArrayDescriptor.createDescriptor("IDARRAY", conn); bookIdArray = new ARRAY(desc, conn, bookIds);
cstmt.setObject(1, bookIdArray, oracle.jdbc.OracleTypes.ARRAY); cstmt.registerOutParameter(2, Types.INTEGER); cstmt.execute(); count = cstmt.getInt(2);
log.info(this.getClass() + ".checkBookStatus: count = " + count);
DbOperHelp.closeStatement(this.getClass(), cstmt); DbOperHelp.closeConnection(this.getClass(), conn); } catch (SQLException e) {
log.error(this.getClass() + ".checkBookStatus--SQLException: " + e.getMessage()); DbOperHelp.closeStatement(this.getClass(), cstmt); DbOperHelp.closeConnection(this.getClass(), conn); throw new DataAccessException( "When check the books, there is a SQLException: " + e.getMessage(), e.getCause()); }
if (count 0) {
flag = true; }
return flag; }
除了构造函数外,集合还有很多内建函数,这些函数称为方法。 调用方法的语法如下: collectionmethod 下表中列出oracle中集合的方法 方法 描述 使用限制 COUNT 返回集合中元素的个数 DELETE 删除集合中所有元素 DELETE() 删除元素下标为x的元素oracle怎么使用数组
集合:是具有相同定义的元素的聚合。Oracle有两种类型的集合:
可变长数组(VARRAY):可以有任意数量的元素,但必须预先定义限制值。
嵌套表:视为表中之表,可以有任意数量的元素,不需要预先定义限制值。
在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;
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;