oracle pl/sql 备忘

 

通过sqlplus连接oracle及配置相关操作

1.sqlplus   name/ password [as sysdba]

2.进入sqlplus后: SQL> startup

3.shutdown immediate;      //关闭数据库 OR "dbshut" command)

4. define _editor=vi

5.set serveroutput on

6. clear screen

7.edit

8. /       运行

 

pl/sql 基础结构

declare

     变量名  变量类型;

申明基本变量

     var name varchar2(32);     

     var age  number:=22;

申明数组变量

     类似于高级语言的数组

TYPE tabletype IS TABLE OF type_name INDEX BY BINARY_INTEGER ;

申明record

     类似于高级语言的结构体

TYPE record_name IS RECORD(

         field1 type1

 field2 type2 );

申明一表结构类型变量

v_rowtype TABLE_NAME%ROWTYPE ;

 

申明一游标变量

 

     Type sp_cursor is ref cursor; --定义一个游标类型

    

 

CURSOR cur_name IS  select  …..

Begin

Open cur_name;

….

Close cur_name;

End;

 

declare

     cursor emp_cur is

      select first_name from s_emp ;

      v_first varchar2(32);

begin

      open emp_cur;

      while emp_cur%notfound=false loop

           fetch emp_cur into v_first;

           dbms_output.put_line(v_first);

       end loop;

       close emp_cur;

 end;

/

申明一异常

     e_name exception;

     pragma exception_init(e_child_found,-2292);

 

begin

 

 

 

exception

格式

抛出异常: raise exception_name;

exception

     when exception_name then

         dosth …. ;

eg:

 when dup_val_on_index then

 dbms_output.put_line('dup val on index');

 when e_child_found then

 dbms_output.put_line('e_child_found is raised');

 when e_custom then

 dbms_output.put_line('e_custom is raised');

 

end

 

条件

if

if  v_name is null then        -- bool 表达式

…. ;

for

for var in CursorName loop

     var.columnName … ;

end loop;

 

while

 

while bool 表达式 loop

 

end loop;

 

fetch   **   into  **

 

function

create or replace function fun2  (p_id number)

return number

is

     ss number;

begin

     select salary into ss from s_emp

     where id = p_id;

     return ss;

end;

 

trigger

create or replace trigger tri_test2

before insert on t_test

for each row

declare

begin

    select seq_test.nextval into :new.id

    from dual;

end;

 

sequence

-- Create sequence

create sequence SEQ_TEST

minvalue 0

maxvalue 999

start with 21

increment by 1

cache 20;

 

存储过程

create or replace procedure pro_create_table

is

begin

    execute immediate

        'create table pro_table ( id number primary key)';

end ;

 

create or replace procedure proc_inout

(p_in varchar2 , p_out out varchar2 , p_inout in out varchar2)

is

   v varchar2(10);

begin

   v := p_in;

   p_out := p_in||'out';

   p_inout := p_inout||'inout';

   dbms_output.put_line(p_out||p_inout);

end;

 

用于在逻辑上组合过程和函数,(类似于接口)

Create package pk_name as

     Procedure procedureName(arg type);

     Function fun_name(arg type) return number;

End;

包体

Create package body body_name

 is

     Procedure p_name(arg type)

Is

Begin

….

End;

Function f_name(arg type) return number

Is

V_number number;

Begin

End;

End;

 

 

返回结果集的过程

1.创建一个包,定义一个游标

Create or replace package test as

     Type test_curosr is ref cursor;

End test;

 

2.创建过程

Create or replace procedure p_test

(arg number,arg2 out test.test_cursor)

Is

Begin:

     Open arg2 for select …..;

     Execute immediate sql into v_cout;

End;

 

3.java中调用

CallableStatemt   cs = conn.prepareCall(“{call p_test(?,?)}”);

Cs.registerOUtputParameter(2,OracleType.Cursor);

Cs.execute();

//获取结果集

ResultSet rs = (resultset)cs.getObject(2);

 

 

job

创建测试表      

 SQL>   create   table   test(id number,cur_time   date);    

  表已创建。  

 

sequence

CREATE  SEQUENCE test_sequence

INCREMENT  BY   1    --  每次加几个

 START  WITH   1     --  1开始计数

 NOMAXVALUE     --  不设置最大值

 NOCYCLE      --  一直累加,不循环

 CACHE  10 ;

 

 

建触发器

create or replace trigger tri_test_id  

  before insert on test   --test 是表名  

  for each row  

declare  

  nextid number;  

begin  

  IF :new.id IS NULLor :new.id=0 THEN --id是列名  

    select test_sequence.nextval --SEQ_ID正是刚才创建的  

    into nextid  

    from sys.dual;  

    :new.id:=nextid;  

  end if;  

end tri_test_id;   

      

创建一个自定义过程    

SQL>   create   or   replace   procedure   proc_test   as    

     2     begin    

     3     insert   into   test(cur_time)   values(sysdate);    

     4     end;    

     5     /  

 

  

  过程已创建。 

  

创建JOB 

SQL> declare job1 number;  

     begin  

        dbms_job.submit(job1,'proc_test;',sysdate,'sysdate+1/1440');--每天1440分钟,即一分钟运行test过程一次  

    end; 

 

  PL/SQL   JOB已成功完成。 

 

1、 每分钟执行

 

Interval => TRUNC(sysdate,’mi’) + 1 / (24*60)

 

2、 每天定时执行

 

例如:每天的凌晨2点执行

 

Interval => TRUNC(sysdate) + 1 +2 / (24)

 

3、 每周定时执行

 

例如:每周一凌晨2点执行

 

Interval => TRUNC(next_day(sysdate,2))+2/24 --星期一,一周的第二天

 

4、 每月定时执行

 

例如:每月1日凌晨2点执行

 

Interval =>TRUNC(LAST_DAY(SYSDATE))+1+2/24

 

5、 每季度定时执行

 

例如每季度的第一天凌晨2点执行

 

Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24

 

6、 每半年定时执行

 

例如:每年71日和11日凌晨2

 

Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24

 

7、 每年定时执行

 

例如:每年11日凌晨2点执行

 

Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+2/24

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值