Oracle数据库零散知识02
15,函数的创建,要求必须有返回值,必须在语句中调用,需要多个返回值时,使用out参数类型,在user_procedures表中查询属性,在user_source表中查询源代码,创建示例:
CREATE OR REPLACE FUNCTION my_function_01--创建函数 (v_01 IN NUMBER)--参数列表 RETURN NUMBER--返回类型 is--标识 res NUMBER;--变量的声明 BEGIN--函数主体 res := v_01; RETURN res;--返回值 END;
16,异常,分为预定义异常(有名字,有编号),非预定义异常(有编号无名字),自定义异常(无名字无编号),两个常用异常,no_data_found,too_many_rows声明及处理自定义异常示例:
DECLARE my_exp EXCEPTION;--声明一个异常 PRAGMA EXCEPTION_INIT (my_exp,-20113);--关联异常编号 20000-20999; BEGIN RAISE my_exp;--抛异常使用raise EXCEPTION--语句中异常处理部分 WHEN my_exp THEN--获取异常 when .. then ..// when others then.. dbms_output.put_line('my exception'); END;
17,pl/sql中可以直接使用dml,dql语言,使用ddl语言时需要使用 execute immediate 关键字;示例:
DECLARE v_str VARCHAR2(30); BEGIN v_str := 'create table stu(id number)';--dml语句 EXECUTE IMMEDIATE v_str;--使用关键字 END;
18,游标分静态游标与ref游标,静态的分为显式游标和隐式游标,显式游标使用需要四个步骤,单行循环提取示例:
DECLARE CURSOR cursor_01--声明一个无参数游标 IS SELECT * FROM student; v_stu student%ROWTYPE;--单行接收 BEGIN OPEN cursor_01;--打开游标 LOOP FETCH cursor_01 INTO v_stu;--从游标中提取 EXIT cursor_01%NOTFOUND; ..... CLOSE cursor_01;--关闭游标 END;
使用多行循环提取到表提高效率示例:
DECLARE CURSOR cursor_01--声明一个无参数游标 IS SELECT * FROM student; TYPE tab IS TABLE OF student%ROWTYPE; v_stu tab;--表接收 BEGIN OPEN cursor_01;--打开游标 LOOP FETCH cursor_01 BULK COLLECT INTO v_stu LIMIT 2;--从游标中提取,每次提取两行 dbms_output.put_line(v_stu(1).sno);--取两行其中一行数据 EXIT cursor_01%NOTFOUND; ..... CLOSE cursor_01;--关闭游标 END;
使用cursor for loop 简化查询:
DECLARE CURSOR cursor_01--声明一个无参数游标 IS SELECT * FROM student; BEGIN OPEN cursor_01;--打开游标 FOR cur IN cursor_01 --cursor for loop LOOP EXIT cursor_01%NOTFOUND; dbms_output.put_line(cur.sno); ..... CLOSE cursor_01;--关闭游标 END;
带参数游标主要是为了限制查询条件:
DECLARE CURSOR cursor_01 (sn VARCHAR2(4)) IS SELECT * FROM student WHERE sname LIKE '%'||sn||'%';--限制查询条件
隐式游标,默认名为sql,select into或dml操作会产生隐式游标,其属性值是最新执行的sql语句,对数据有影响sql%found则为true。
19,复合类型的变量声明,记录类型示例:
DECLARE TYPE re IS RECORD--记录类型 ( v_id student.sno%TYPE,--单字段类型 v_sname VARCHAR2(10) ); BEGIN SELECT sno , sname INTO re FROM Student; ......
直接单行表类型声明:
DECLARE v_stu student%ROWTYPE;--单行类型
索引表示例:
DECLARE TYPE tab IS TABLE OF Student%ROWTYPE--索引表类型 INDEX BY BINARY_INTEGER; t_stu tab;
Varray变长数组:
DECLARE TYPE arr IS VARRAY(100) OF VARCHAR2(20);--变长数组,100大小 v_arr arr := arr('1','2');--初始两个元素
20,视图的创建示例:
CREATE OR REPLACE VIEW view_name AS SELECT * FROM Student;