`
abin103
  • 浏览: 152973 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

oralce 集合比较 和常用方法

阅读更多

PL/SQL中没有数组的概念,他的集合数据类型和数组是相似的。在7.3以前的版本中只有一种集合,称为PL/SQL表,在这之后又有两种集合数据类型:嵌套表和varray。其中varray集合中的元素是有数量限制的,index_by表和嵌套表是没有这个限制的。index-by表是稀疏的,也就是说下标可以不连续,varray类型的集合则是紧密的,他的下标没有间隔。index_by表不能存储在数据库中,但是嵌套表和varray可以被存储在数据库中。
集合在使用时必须先使用type进行定义方可使用

1.index_by表
type type_name is table of element_type [NOT NULL] index by binary_integer

2.嵌套表
type type_name is table of element_type [NOT NULL]

3.varray
type type_name is [varray ¦varying array](max_size) of element_type[NOT NULL]

一,index_by表

TYPE TYPE1 IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;

1.使用的时候需要先赋值后读取,至少也要先初期化一下,否则会出现异常:ORA-01403: no data found。
2.这种数组不需要事先指定上限,下标可以不连续,可以是0或负数。
例:v1 TYPE1;
v1(-1) := '-1';
v1(0) := '0';
v1(1) := '1';
DBMS_OUTPUT.put_line(v1(-1)); --访问合法
DBMS_OUTPUT.put_line(v1(2)); --访问非法

二,嵌套表

TYPE TYPE2 IS TABLE OF VARCHAR2(10);

1.必须进行初期化,否则会出现异常:ORA-06531: Reference to uninitialized collection
2.初期化方法:
v1 TYPE2 := TYPE2(); --声明时初期化数组为空
v2 TYPE2 := TYPE2('1','2','3','4','5'); --声明时初期化数组为5个元素
v1 := TYPE2(); --初期化后数组为空
v2 := TYPE2('1','2','3','4','5'); --初期化后数组为5个元素
3.数组元素的访问:
下标从1开始,不能超过数组所有元素的总和,当下标超出允许范围时,出现异常:ORA-06532: Subscript outside of limit
因为不能访问空数组,所以空数组的场合,必须进行数组扩展。
例:v1.EXTEND;
V1(1):= ‘1’; --访问合法
v1(2):= ‘2’; --访问非法,之前必须再次执行v1.EXTEND;
例:v2的下标范围是1~5。
v2(5):= ‘Hello’; --访问合法
DBMS_OUTPUT.put_line(v2(6)); --访问非法

三,Varray

TYPE TYPE3 IS ARRAY(5) OF VARCHAR2(10);
由于类型定义时的元素个数限制,所以TYPE3的变量在使用时最大的元素个数不能超过5个。
与嵌套表基本相同(略)

四,集合内建函数
集合还有很多内建函数,这些函数称为方法,调用方法的语法如下:
collection.method
下表中列出oracle中集合的方法
方法 描述 使用限制
COUNT 返回集合中元素的个数
DELETE 删除集合中所有元素
DELETE(x) 删除元素下标为x的元素,如果x为null,则集合保持不变 对VARRAY非法
DELETE(x,y) 删除元素下标从X到Y的元素,如果X>Y集合保持不变 对VARRAY非法
EXIST(x) 如果集合元素x已经初始化,则返回TRUE, 否则返回FALSE
EXTEND 在集合末尾添加一个元素 对Index_by非法
EXTEND(x) 在集合末尾添加x个元素 对Index_by非法
EXTEND(x,n) 在集合末尾添加元素n的x个副本 对Index_by非法
FIRST 返回集合中的第一个元素的下标号,对于VARRAY集合始终返回1。
LAST 返回集合中最后一个元素的下标号, 对于VARRAY返回值始终等于COUNT。
LIMIT 返回VARRY集合的最大的元素个数,对于嵌套表和Index_by集合无用。
NEXT(x) 返回在元素x之后及紧挨着它的元素的值,如果该元素是最后一个元素,则返回null。
PRIOR(x) 返回集合中在元素x之前紧挨着它的元素的值,如果该元素是第一个元素,则返回null。
TRIM 从集合末端开始删除一个元素 对index_by不合法
TRIM(x) 从集合末端开始删除x个元素 对index_by不合法

oralce

oracle:

1、利用伪列号来查询中间列和后几列:

后几列:SELECT fkfs,(SELECT mc FROM  w_jsfs WHERE dm = t.fkfs) mc , COUNT(*) FROM y_khda t GROUP BY fkfs;

中间列:select * from (select rownum row_id ,wjm ,czsj ,czy FROM c_zwrz) where row_id between 5 and 9;

2、翻页的SQL语句的处理
语句一:
SELECT ID, [FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW, ID FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3; 
  
语句二:
SELECT * FROM (( SELECT ROWNUM AS NUMROW, c.* from (select [FIELD_NAME,...] FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3;

3、
表达式:
数字表达式符号:+ - * / **
DECLARE
  result INTEGER;
BEGIN
     result := 10+3*4-20+5**2;
     dbms_output.put('运算结果:'||to_char(result));
     dbms_output.put_line('');
END;
字符表达式符号:||
关系表达式符号:< > = like in <= >= != between
逻辑表达式:not or and
函数:to_char to_date to_number
事务三个关键字:commit rollback savepoint
其savepoint的用法:
执行处理语句;
savepoint thispoint;
继续其他的处理语句;
rollback to thispoint;(回滚到定义thispoint处)
继续运行;

自治事务:
8i以上版本,不影响主事务。
在存储过程的is\as
后面声明PRAGMA AUTONOMOUS_TRANSACTION; 
自治事务防止嵌套提交,使事务在自己的事务区内提交或回滚不会影响其他的事务。

函数的一些用法
SELECT c.*,SYSDATE,upper(concat('liu','nihao')) a,
instr('liuqiuanyi','i',1,2) b,lpad('liu',8,'hi!') c,
rtrim('   liuquanyi    ',' ') d,TRIM('liu quan yi') e,
REPLACE('you love me!','you','i') AS f,
translate('you love meu!','you','???') AS f2,
TRANSLATE('fumblfe','uf','aa') f3,
last_day(sysdate) g,convert('liuquanyi','we8hp','f7dec') h
FROM dual c;

4、保留字
begin end; 
loop end loop;
if then elsif end if;
while;
for 变量 in 上边界..下边界;
declare;
:=; %type;into;type;
commit;rollback;
exception;
exception when others then;
is;as;

exit;exit then;

DECLARE
  num1 INTEGER := 0;
  i INTEGER /*:= 0*/;
BEGIN
     FOR i IN 1..10 LOOP
         num1 := num1 + 1;
     END LOOP;  
     dbms_output.put_line('结果:'||num1);
END; 

定义常变量:

[常/]变量名称 [constant/] 类型标识符【(长度)】 【not null】:= 值;

a 定义与数据库表字段相适应的变量:用%type;
变量名称 用户名.表.字段%type;(注意,必须到字段加%type)

b 定义记录类型变量:
[b1]、定义记录类型的数据类型
type 数据类型名 is record(
  变量名1 int,
  变量名2 date,
  变量名3 varchar(20)
)
[b2]、根据[1]来定义一个变量
变量名 数据类型名;
select * into 变量名 from 表 where 条件;
必须返回一行记录;(可以用rownum=1)

c 定义与数据库表行记录相适应的变量;用%rowtype(可以使用游标,方法一样)
变量名 表名%rowtype;
select * into 变量名 from 表名 where 条件;
必须返回一行记录;(可以用rownum=1)

d 定义一维表类型变量 (一维数组)
type 表类型 is table of 类型 index by binary_integer;
 表变量名 表类型;
表类型 为 类型的线性数组。用 pls_integer当溢出会出现错误。

DECLARE
  TYPE tabletype1 IS TABLE OF VARCHAR2(12) INDEX BY BINARY_INTEGER;
  TYPE tabletype2 IS TABLE OF test_plsql.NAME%TYPE INDEX BY BINARY_INTEGER;
  t1 tabletype1;
  t2 tabletype2;
BEGIN
  t1(1) := '大学';
  t1(2) := '大专';
  t1(8) := '客户学习不拿';
  t2(1) := 88;
  t2(2) := 55;
  t2(3) := '送电否撒发';
  dbms_output.put_line(t1(1)||'--'||t1(8)||'--'||t2(1));
  dbms_output.put_line(t1(2)||'--'||t2(3)||'--'||t2(2));
END; 


e 定义多维表类型变量 (生成一个表类型,二维数组变量)
DECLARE
  TYPE tabletype1 IS TABLE OF test_plsql%ROWTYPE INDEX BY BINARY_INTEGER;
  t1 tabletype1;
BEGIN
  SELECT * INTO t1(9)
  FROM test_plsql
  WHERE id = 9;
  dbms_output.put_line(t1(9).id||'--'||t1(9).NAME||'--'||t1(9).curdate);
END;  
表类型变量的一些属性:count/delete/first/last/next/exists/prior.

DECLARE
  TYPE tabletype1 IS TABLE OF Varchar2(9) INDEX BY BINARY_INTEGER;
  t1 tabletype1;
BEGIN
  t1(1) := '成都市';
  t1(2) := '北京市';
  t1(3) := '青岛市';
  t1(4) := ' 222 ';
  t1(5) := ' 555 ';
  dbms_output.put_line('总记录:'||to_char(t1.COUNT));
  dbms_output.put_line('第一条记录'||t1.FIRST);
  dbms_output.put_line('最后一条记录'||t1.LAST);
  dbms_output.put_line('第二条的前一条记录'||t1.PRIOR(2));
  dbms_output.put_line('第二条的后一条记录'||t1.NEXT(2));

  dbms_output.put_line('第四条的前一条记录:'||t1.PRIOR(4));
  dbms_output.put_line('第四条的后一条记录:'||t1.NEXT(4));
END; 


根据游标来生成的记录类型变量:变量名 游标名%ROWTYPE;


5、
类型标识符
boolean;
number 数字型;
int pls_integer binary_integer(带符号);
char 定长字符;
varchar2 (2000)long(2G);
date;
 
系统包:dbms_output(系统输出包)

6、序列器
create sequence DLYX.SEQ_BDZBH
minvalue 1
maxvalue 99999
start with 56
increment by 1
cache 10;

create sequence user.sequencename
 increate by 1 start with 1
 maxuvalue 1.0E28 minvalue 1
 nocycle cache 20 noorder;

使用方法:SEQ_BDZBH.NEXTVAL

7、建立临时表
-- Create table
create global temporary table DLYX.C_KBTK_TEMP
(
  HH    VARCHAR2(10),
  JFDBH VARCHAR2(10),
  JFLX  VARCHAR2(4),
  TDL   NUMBER(10),
  TDF   NUMBER(12,2),
  DFID  VARCHAR2(15),
  DJM   VARCHAR2(5),
  DJJC  VARCHAR2(30),
  DJ    NUMBER(7,5)
)
on commit delete rows;

8、
create table 的表结构:
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

9、
对sql语言的解释
UPDATE a
 SET a.rec1 = (SELECT b.rec1 FROM b WHERE a.hh= b.hh)
  WHERE a.ny ='200512';
意义:表 a 的条件  a.ny ='200512'取出一行,然后根据SELECT b.rec1 FROM b WHERE a.hh= c.hh交流来 SET a.rec1 =的结果。循环修改。

SELECT * FROM a WHERE  
exists(SELECT * FROM b WHERE a.rec1 = b.rec1)
先检索一行a,再根据条件 SELECT * FROM b WHERE a.rec1 = b.rec1
来确定该行的处理。
循环列出。

10、
游标定义:cursor 游标名 is select 语句;
打开游标:open 游标名;(游标记录送入内存,并指向第一第一条记录)
取出游标:fetch 游标名 into 变量名1,变量名2,……
或者
fetch 游标名 into 记录型变量名;
关闭游标:close 游标名;
游标属性:%isopen 测试游标是否打开!如果没有打开就用fetch就提示错误!
%found  必须fetch运行过才能用%found;判断游标是否还有数据;
%notfound 该游标是否有数据,不论是否fetch过!
%rowcount 表示目前游标的位置,即具体数据行数;


-- Created on 2005-12-27 by LONGSHINE 
declare 
  field test_plsql.num%TYPE;
  CURSOR mycursor IS
         SELECT * FROM test_plsql
         WHERE id < 4;
  record1 mycursor%ROWTYPE;
BEGIN
     field := 800;
     OPEN mycursor;
/*     LOOP
     dbms_output.put_line('kaishi!');
     FETCH mycursor INTO record1;
     IF mycursor%FOUND THEN
        dbms_output.put_line('if!');
      --  FETCH mycursor INTO record1;
        dbms_output.put_line(to_char(record1.id));
     ELSE 
        dbms_output.put_line('没有记录了');
        EXIT;
     END IF;
     END LOOP;*/
     FETCH mycursor INTO record1;
     WHILE mycursor%FOUND LOOP
        dbms_output.put_line(to_char(record1.NAME));
        dbms_output.put_line(mycursor%ROWCOUNT);
        FETCH mycursor INTO record1;
 
 IF mycursor%NOTFOUND THEN
           dbms_output.put_line('nofound');
        ELSE
            dbms_output.put_line('have found');
        END IF;
     END LOOP;
     close mycursor;
end;

11、
过程:
create or replace procedure 过程名 as
 声明语句段;
begin
 执行语句段;
exception
 异常处理语句段;
end;

as代替declare;
不带参数,带参数;
create or replace procedure testPro
IS
  tempdate test_plsql.curdate%TYPE;
begin
  SELECT curdate INTO tempdate
  FROM test_plsql WHERE id = 1;
  dbms_output.put_line(to_char(tempdate));
end testPro;

create or replace procedure testPro2(
       rq in test_plsql.ID%TYPE,
       sj in out VARCHAR2) 
IS
  temp_sj VARCHAR2(50);
BEGIN
  BEGIN
    SELECT NAME INTO temp_sj
    FROM test_plsql
    WHERE ID = rq AND rownum = 1;
    EXCEPTION 
      WHEN NO_DATA_FOUND THEN
         --  temp_sj := NULL;
           sj :='发生错误!';
     -- RETURN;
  END;
  IF temp_sj IS NULL THEN
     temp_sj := 'noname';
  END IF;
  temp_sj := '原来:'||temp_sj;
  dbms_output.put_line(temp_sj);
  sj := temp_sj||'-》现在名称:'||sj;
end testPro2;


12、异常
a定义:
declare
   异常名 exception;
b触发异常处理
   raise 异常名;
c处理异常
exception
when 异常名1 then
   异常处理语句段1;
when 异常名2 then
   异常处理语句段2;
d例子:
DECLARE 
     error EXCEPTION;
     i INTEGER := 2;
BEGIN
     SELECT num INTO i
     FROM test_plsql 
     WHERE rownum = 1;
   
     IF i<10 THEN
        RAISE error;
     END IF;  
     EXCEPTION
       WHEN error THEN
        -- BEGIN
          dbms_output.put_line('error'||to_char(i));
        --RETURN;
        --END;
    dbms_output.put_line(i);
END;

--可以使用RAISE_APPLICATION_ERROR来创建自己的错误处理!
常用的系统异常:
1、NO_DATA_FOUND
A SELECT INTO statement returns no rows, or your program references a deleted element in a nested table or an uninitialized element in an index-by table. SQL aggregate functions such as AVG and SUM always return a value or a null. So, a SELECT INTO statement that calls an aggregate function never raises NO_DATA_FOUND. The FETCH statement is expected to return no rows eventually, so when that happens, no exception is raised
2、TOO_MANY_ROWS
A SELECT INTO statement returns more than one row.
3、DUP_VAL_ON_INDEX
Your program attempts to store duplicate values in a database column that is constrained by a unique index.


    BEGIN
    END LOOP;
    EXCEPTION
        WHEN no_data_found THEN
             dbms_output.put_line('在kh_cbkp没有客户编号!');
             RETURN;
        WHEN TOO_MANY_ROWS THEN
             dbms_output.put_line('在kh_cbkp有重复的客户编号!');
             RETURN;
        WHEN OTHERS THEN
             dbms_output.put_line('处理重复的客户编号发生异常!');
             RETURN;
    END;


用户定义的的异常处理  

1
exception_init语句  允许为ORACLE错误命名  
调用格式:
 
pragma exception_init(<表达式>,);  
例  a 
declare  
  deadlock_detected exception;  
  pragma exception_init(deadlock_detected,-60);  
例 b
    ex_b_dlxx_null EXCEPTION;
    PRAGMA EXCEPTION_INIT(ex_b_dlxx_null,-1407);
    begin
      ***
    EXCEPTION
      WHEN ex_b_dlxx_null THEN
      ***
    end;

    2
    可以使用RAISE_APPLICATION_ERROR来创建自己的错误处理并立即抛出:
  RAISE_APPLICATION_ERROR(error_number,error_message,[keep_errors]);
  其中error_number是从-20000到-20999之间的参数;error_message是相应的提示信息,小于512字节。如:
  
  CREATE OR REPLACE PROCEDURE Register (
  p_StudentID IN students.id%TYPE,
  p_Department IN classes.department%TYPE,
  p_Course IN classes.course%TYPE) AS
  v_CurrentStudents NUMBER; -- 班上学生的当前号
  v_MaxStudents NUMBER;   -- 班上学生的最大号
  
  BEGIN
  /* 找出学生的当前号和最大号 */
  SELECT current_students, max_students
  INTO v_CurrentStudents, v_MaxStudents
  FROM classes
  WHERE course = p_Course
  AND department = p_Department;
  
  /* 确认另外的学生是否有足够的教室*/
  IF v_CurrentStudents + 1 > v_MaxStudents THEN
  RAISE_APPLICATION_ERROR(-20000, 'Can''t add more students to ' ||
  p_Department || ' ' || p_Course);
  END IF;
  
  /* 加一个学生在本班 */
  ClassPackage.AddStudent(p_StudentID, p_Department, p_Course);
  
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
  RAISE_APPLICATION_ERROR(-20001, p_Department || ' ' || p_Course ||
  ' doesn''t exist!');
  END Register;

分享到:
评论

相关推荐

    初学者必备oracle 1000个常用命令_oracle 命令大全_oracle命令集合

    oracle 常用命令_oracle 命令大全_oracle命令集合_oracle基本命令 非常方便,带查询功能,能很方便的查询你要找的oracle命令写法

    Oracle常用函数集合

    以下是对"Oracle常用函数集合"的详细解析: 1. **数值函数**:Oracle提供了多种处理数字的函数,如`ROUND()`用于四舍五入,`TRUNC()`用于截断小数,`MOD()`计算余数,`DECODE()`用于条件判断,以及`POWER()`和`SQRT...

    Oracle_plsql常用方法汇总

    Oracle PL/SQL 中的常用方法汇总 Oracle PL/SQL 是一种强大的编程语言,广泛应用于 Oracle 数据库管理系统中。...这些是 Oracle PL/SQL 中的一些常用方法汇总,通过这些方法,可以实现各种复杂的操作和数据处理。

    Oracle数据库维护常用SQL语句集合

    13. **存储过程和函数**:存储过程是预编译的SQL语句集合,可封装复杂的业务逻辑。函数则返回一个值,常用于查询中。 14. **权限管理**:Oracle提供GRANT和REVOKE语句来控制用户对数据库对象的访问权限。 15. **...

    oracle性能监控常用语句集合

    本资料集包含了Oracle性能监控的一些常用语句,旨在帮助用户更好地理解和优化数据库性能。以下是这些语句的主要类别及其详解: 1. **V$视图查询**: Oracle提供了大量的动态性能视图(V$视图),通过查询它们可以...

    oracle存储过程常用技巧

    Oracle存储过程常用技巧 Oracle存储过程是一种强大的数据库对象,它可以帮助开发者简化复杂的业务逻辑,并提高数据库的安全性和性能。在 Oracle 中,存储过程是一种特殊的 PL/SQL 程序,它可以接受输入参数,执行...

    oracle常用函数和类型

    Oracle提供了许多其他功能,如数学函数、转换函数、日期和时间函数、集合函数、聚合函数等,使得数据库操作和查询变得极其灵活和强大。理解并熟练使用这些函数和数据类型是Oracle数据库管理的基础。

    Oracle常用方法

    集合部分Oracle常用操作,实现建立表空间,创建用户,分配权限,备份/还原Oracle数据库等等。

    ORACLE常用日期函数集合

    ### ORACLE常用日期函数集合详解 #### 一、概述 在Oracle数据库中,日期处理是一项非常重要的功能。本文将详细介绍一些常用的Oracle日期函数及其应用场景,帮助数据库管理员或开发者更好地理解和运用这些函数,以...

    oracle常用监控SQL语句集合

    以上只是"oracle常用监控SQL语句集合"中的一部分内容,实际文档可能还包含更多实用的查询语句和技巧,帮助用户深入理解Oracle数据库的运行机制,提升数据库管理和性能优化的能力。学习并熟练运用这些SQL语句,将极大...

    oracle常用命令操作集合

    以下将详细介绍标题和描述中提到的Oracle命令操作集合,以及与之相关的知识点。 1. **Oracle常用操作命令**: - `sqlplus`:Oracle的命令行工具,用于执行SQL语句和PL/SQL块。 - `connect`:连接到Oracle数据库,...

    Oracle String常用方法封装

    描述中提到的"Oracle String常用方法集合封装为PackageBody",PackageBody是Oracle数据库中的一个组件,用于存储过程和函数的实现。将字符串处理的方法封装到PackageBody中,可以避免代码重复,提高代码的组织性,...

    Oracle sql 函数大全 比较常用的一些 函数 整理

    Oracle SQL 函数大全是指在 Oracle 数据库管理系统中用于处理和操作数据的函数集合。本文将对 Oracle SQL 函数大全进行分类和讲解,涵盖字符串函数、字符转换函数、去空格函数、取子串函数、字符串比较函数、字符串...

    最全的ORACLE常用命令集合

    ### ORACLE常用命令详解 #### 一、ORACLE的启动和关闭 在ORACLE数据库管理中,正确地启动和关闭数据库是非常重要的操作。这不仅涉及到数据库的可用性,还关系到数据的一致性和完整性。 ##### 在单机环境下的启动...

    oracle常用sql.rar

    "oracle常用sql.rar"这个压缩包文件显然包含了关于Oracle数据库中常用SQL语句的集合,这对于学习和工作中解决常见问题非常有帮助。以下是一些Oracle SQL的重要知识点: 1. **锁表查询**: 在Oracle中,锁定数据是...

    Oracle 常用脚本.zip

    综上所述,"Oracle 常用脚本.zip"这个压缩包可能涵盖了Oracle数据库管理的各个方面,是数据库管理员和开发人员日常工作中不可或缺的工具集合。通过理解和应用这些脚本,我们可以更高效、更专业地管理和维护Oracle...

    ORACLE 常用命令集合

    Oracle数据库是全球...以上仅是Oracle常用命令的一部分,实际操作中还有更多高级特性和复杂的管理任务。熟练掌握这些命令,可以更有效地管理Oracle数据库,提升工作效率。不断学习和实践,是成为一名优秀DBA的关键。

    Oracle函数及常用sql

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其强大的功能和灵活性使得它在企业级应用中占据了重要地位。本篇文章将深入探讨Oracle中的基本函数以及常用SQL查询,以帮助初学者快速入门,并为日常使用...

Global site tag (gtag.js) - Google Analytics