ORACLE 的游标、存储过程、触发器以及表的连接查询

来源:互联网 发布:ubuntu wily 编辑:程序博客网 时间:2024/06/07 19:14

1 表的连接查询

 

连接有相等连接、不等连接、自连接和外连接。但比较常说的是内连接和外连接。

 

相等连接示例:select a.name , b.number from a ,b where a.id=b.id

不等连接示例:select a.name ,b.number from a,b where a.id between b.losal and b.hisal

自连接示例:select t1.name ,t2.manager from emp t1,emp t2 where t1.managername=t2.name

外连接示例: select d.dname,e.ename from dept d,emp e where d.deptno=e.deptno(+) and e.deptno(+) =10

 

当使用“+”操作符执行外连接时,如果在where 子句中包含多个条件则必须在所有条件中都包含该操作符,它只能用于列而不能用在表达示上,且不能和OR和IN操作符一起使用。

 

为了简化连接查询,使得连接查询更加直观更容易写,SQL1999标准为连接查询提供了新语法,如:

select table.columnname,table2.columnname from table1

[cross join table2] |[Natural join table2]|

[join table using (columnname)]|

[join table2 on (table1.columnname=table2.columnname)]|

[left|right|full outer join table2]

 

 

2 游标的使用

游标分显式和隐含,后者用于处理单行SELECT into和DML语句,前者用于处理SELECT语句返回的多行数据。

游标的使用分为:

定义游标

打开游标

提取数据

关闭游标

example:

declare

    cursor emp_cursor is

    select ename,job,sal from emp where dep=&dno;---&dno is the input parameter

v_ename emp.ename%type;

v_job emp.job%type;

v_sal emp.sal%type;

 

begin

 open emp_cursor;

 loop

 fetch emp_cursor int v_ename,v_job,v_sal;

 exit when emp_cursor%notfound;

 dbms_output.put_line('name'||v_ename||'job'||v_job||'salary'||v_sal);

 end loop;

 close emp_cursor;

end;

/

3存储过程

   Create or replace procedure divide(num1 in out number,num2 in out number) is

      v1 number;

      v2 number;

   begin

      v1 :=TRUNC(num1/num2);

      v2 :=MOD(num1,num2);

      num1 := v1;

      num2 := v2;

   end;

   /

调用存储过程:

delcare

num1 number;

num2 number;

num1 := 3;

num2 := 5;

exec divide(num1,num2)

 

4触发器

触发器包括语句触发器和行触发器两种类型。

语句触发器语法:

create or replace trigger trigger_name

  before|after   event1 [or event2 or event 3] on table_name

SQL block;

 

create or replace trigger tr_sec_emp

before insert or update or delete on emp

begin

 ....

end;

/

行触发器语法:

create or replace trigger trigger_name

before or after event1 or event2 or event3

on table_name

for each row [when condition]

sql block;

原创粉丝点击