Oracle中用sql查询获取数据库的所有触发器,所有存储过程,所有视图,所有表
Select object_name From user_objects Where object_type='TRIGGER'; --所有触发器
Select object_name From user_objects Where object_type='PROCEDURE'; --所有存储过程
Select object_name From user_objects Where object_type='VIEW'; --所有视图
Select object_name From user_objects Where object_type='TABLE'; --所有表
存储过程的创建
Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常。
存储过程创建语法
create [or replace] procedure 存储过程名(param1 in type,param2 out type)
as
变量1 类型(值范围);
变量2 类型(值范围);
Begin
Select count(*) into 变量1 from 表A where列名=param1;
If (判断条件) then
Select 列名 into 变量2 from 表A where列名=param1;
Dbms_output.Put_line(‘打印信息’);
Elsif (判断条件) then
Dbms_output.Put_line(‘打印信息’);
Else
Raise 异常名(NO_DATA_FOUND);
End if;
Exception
When others then
Rollback;
End;
带参数存储过程含赋值方式
create or replace procedure procQuery
(sid_no in emp.id_no%type, --传入参数
sname out varchar, --定义输出和输出类型
sjob in out varchar) --IN OUT表示该参数可以向该过程中传递值,也可以将某个值传出去。
as
icount number;
begin
select count(*) into icount from emp where sal>isal and job=sjob;
if icount=1 then
....
else
....
end if;
exception
when too_many_rows then
DBMS_OUTPUT.PUT_LINE('返回值多于1行');
when others then
DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS过程中出错!');
end;
%这个是取前面字段的类型,也就是说sjob的类型就是表emp的字段job的类型。这样在修改表emp的job类型后(从int变char,或者改变长度),不用修改存储过程。兼容性强。
存储过程中游标定义使用
as //定义(游标一个可以遍历的结果集)
CURSOR cur_1 IS
SELECT area_code,area_name,SUM(sub_town)
FROM city_area
GROUP BY area_code;
begin --执行(常用For语句遍历游标)
FOR rec IN cur_1
LOOP --循环
UPDATE xxxxxxxxxxx_T
SET sub_towm = rec.sub_town
WHERE area_code = rec.area_code
AND CMCODE = rec.CMCODE
END LOOP;
游标的概念:
游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。一定程度上避免频繁的磁盘数据交换带来降低效率的影响。
游标有两种类型:显式游标(用户自定义)和隐式游标。
在前述程序中用到的SELECT…INTO…查询语句,一次只能从数据库中提取一行数据,对于这种形式的查询和DML操作,系统都会使用一个隐式游标。
如下
DML操作和单行SELECT语句会使用隐式游标,它们是:
插入操作:INSERT。
更新操作:UPDATE。
删除操作:DELETE。
单行查询操作:SELECT … INTO …
使用隐式游标的属性,判断对雇员工资的修改是否成功。
SET SERVEROUTPUT ON
BEGIN
UPDATE emp SET sal=sal+100 WHERE empno=1234;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('成功修改雇员工资!');
COMMIT;
ELSE
DBMS_OUTPUT.PUT_LINE('修改雇员工资失败!');
END IF;
END;
--通过SQL%FOUND属性判断修改是否成功,并给出相应信息
但是如果要提取多行数据,就要由程序员定义一个显式游标,并通过与游标有关的语句进行处理。显式游标对应一个返回结果为多行多列的SELECT语句。
打开游标时,SELECT语句的查询结果就被传送到了游标工作区。
提取数据
在可执行部分,按以下格式将游标工作区中的数据取到变量中。提取操作必须在打开游标之后进行。
FETCH 游标名 INTO 变量名1[,变量名2…];
FETCH语句一次返回指针所指的一行数据,要返回多行需重复执行,可以使用循环语句来实现。
存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错