Oracle dblink job 存储过程.docx

上传人:b****6 文档编号:7781015 上传时间:2023-01-26 格式:DOCX 页数:9 大小:18.18KB
下载 相关 举报
Oracle dblink job 存储过程.docx_第1页
第1页 / 共9页
Oracle dblink job 存储过程.docx_第2页
第2页 / 共9页
Oracle dblink job 存储过程.docx_第3页
第3页 / 共9页
Oracle dblink job 存储过程.docx_第4页
第4页 / 共9页
Oracle dblink job 存储过程.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

Oracle dblink job 存储过程.docx

《Oracle dblink job 存储过程.docx》由会员分享,可在线阅读,更多相关《Oracle dblink job 存储过程.docx(9页珍藏版)》请在冰豆网上搜索。

Oracle dblink job 存储过程.docx

Oracledblinkjob存储过程

同一台数据库服务器上两个不同的数据库可以通过共享来实现数据共享。

两台不同的数据库服务器无法通过这种方法来实现数据共享,这个时候可以使用databaselinks。

创建全局databaselinks,则必须使用systm或sys用户,在database前加public

1.两种方式创建

1.1已经配置本地服务

CREATEDATABASELINK数据库链接名CONNECTTO用户名IDENTIFIEDBY密码USING'本地配置的数据的实例名';

1.2未配置本地服务

createdatabaselinklinkfwq

connecttofzeptidentifiedbyneu

using'(DESCRIPTION=

(ADDRESS_LIST=

(ADDRESS=(PROTOCOL=TCP)(HOST=10.142.202.12)(PORT=1521))

(CONNECT_DATA=

(SERVICE_NAME=fjept)

)';

两种方法配置dblink是差不多的,第二种方法不受本地配置的数据的实例名的影响。

2查询远程数据库的数据

SELECT……FROM表名@数据库链接名;

查询、删除和插入数据和操作本地的数据库是一样的,只不过表名需要写成“表名@dblink服务器”而已。

Job

创建测试表

  SQL>createtableTEST(adate);

  

  表已创建。

  

  创建一个自定义过程

  SQL>createorreplaceprocedureMYPROCas

   2 begin

   3 insertintoTESTvalues(sysdate);

   4 end;

   5 /

  

  过程已创建。

  

  创建JOB

  SQL>variablejob1number;

  SQL>

  SQL>begin

   2 dbms_job.submit(:

job1,'MYPROC;',sysdate,'sysdate+1/1440');  --每天1440分钟,即一分钟运行test过程一次

   3 end;

   4 /

  

  PL/SQL过程已成功完成。

  

  运行JOB

  SQL>begin

   2 dbms_job.run(:

job1);

   3 end;

   4 /

  

  PL/SQL过程已成功完成。

  

  SQL>selectto_char(a,'yyyy/mm/ddhh24:

mi:

ss')时间fromTEST;

  

  时间

  -------------------

  2001/01/0723:

51:

21

  2001/01/0723:

52:

22

  2001/01/0723:

53:

24

  

  删除JOB

  SQL>begin

   2 dbms_job.remove(:

job1);

   3 end;

   4 /

存储过程

1、创建存储过程

createorreplaceproceduretest(var_name_1intype,var_name_2outtype)as

--声明变量(变量名变量类型)

begin

--存储过程的执行体

endtest;

打印出输入的时间信息

E.g:

createorreplaceproceduretest(workDateinDate)is

begin

dbms_output.putline('Theinputdateis:

'||to_date(workDate,'yyyy-mm-dd'));

endtest;

2、变量赋值

变量名:

=值;

E.g:

createorreplaceproceduretest(workDateinDate)is

xnumber(4,2);

 begin

 x:

=1;

endtest;

3、判断语句:

if比较式thenbeginend;endif;

E.g

createorreplaceproceduretest(xinnumber)is

begin

        ifx>0then

         begin

        x:

=0-x;

        end;

    endif;

    ifx=0then

       begin

        x:

=1;

    end;

    endif;

endtest;

4、For循环

For...in...LOOP

--执行语句

endLOOP;

(1)循环遍历游标

createorreplaceproceduretest()as

Cursorcursorisselectnamefromstudent;namevarchar(20);

begin

fornameincursorLOOP

begin

 dbms_output.putline(name); 

end;

endLOOP;

endtest;

(2)循环遍历数组

 createorreplaceproceduretest(varArrayinmyPackage.TestArray)as

--(输入参数varArray是自定义的数组类型,定义方式见标题6)

inumber;

begin

i:

=1; --存储过程数组是起始位置是从1开始的,与java、C、C++等语言不同。

因为在Oracle中本是没有数组的概念的,数组其实就是一张

--表(Table),每个数组元素就是表中的一个记录,所以遍历数组时就相当于从表中的第一条记录开始遍历

foriin1..varArray.countLOOP     

dbms_output.putline('TheNo.'||i||'recordinvarArrayis:

'||varArray(i));   

 endLOOP;

endtest;

5、While循环

while条件语句LOOP

begin

end;

endLOOP;

E.g

createorreplaceproceduretest(iinnumber)as

begin

whilei<10LOOP

begin    

 i:

=i+1;

end;

endLOOP;

 endtest;

6、数组

首先明确一个概念:

Oracle中本是没有数组的概念的,数组其实就是一张表(Table),每个数组元素就是表中的一个记录。

使用数组时,用户可以使用Oracle已经定义好的数组类型,或可根据自己的需要定义数组类型。

(1)使用Oracle自带的数组类型

xarray;--使用时需要需要进行初始化

e.g:

createorreplaceproceduretest(youtarray)is

 xarray;  

 begin

x:

=newarray();

y:

=x;

endtest;

(2)自定义的数组类型(自定义数据类型时,建议通过创建Package的方式实现,以便于管理)

E.g(自定义使用参见标题4.2)createorreplacepackagemyPackageis

 --Publictypedeclarations typeinfoisrecord(   namevarchar(20),   ynumber);

 typeTestArrayistableofinfoindexbybinary_integer; --此处声明了一个TestArray的类型数据,其实其为一张存储Info数据类型的Table而已,及TestArray就是一张表,有两个字段,一个是

name,一个是y。

需要注意的是此处使用了Indexbybinary_integer编制该Table的索引项,也可以不写,直接写成:

typeTestArrayis

tableofinfo,如果不写的话使用数组时就需要进行初始化:

varArraymyPackage.TestArray;varArray:

=newmyPackage.TestArray();

endTestArray;

7.游标的使用Oracle中Cursor是非常有用的,用于遍历临时表中的查询结果。

其相关方法和属性也很多,现仅就常用的用法做一二介绍:

(1)Cursor型游标(不能用于参数传递)

createorreplaceproceduretest()is  

cusor_1Cursorisselectstd_namefromstudentwhere ...; --Cursor的使用方式1 cursor_2Cursor;

begin

selectclass_nameintocursor_2fromclasswhere...; --Cursor的使用方式2

可使用ForxincursorLOOP....endLOOP;来实现对Cursor的遍历

endtest;

(2)SYS_REFCURSOR型游标,该游标是Oracle以预先定义的游标,可作出参数进行传递

createorreplaceproceduretest(rsCursoroutSYS_REFCURSOR)is

cursorSYS_REFCURSOR;namevarhcar(20);

begin

OPENcursorFORselectnamefromstudentwhere...--SYS_REFCURSOR只能通过OPEN方法来打开和赋值

LOOP

 fetchcursorintoname   --SYS_REFCURSOR只能通过fetchinto来打开和遍历exitwhencursor%NOTFOUND;             --SYS_REFCURSOR中可使用三个状态属性:

                                       ---%NOTFOUND(未找到记录信息)%FOUND(找到记录信息)                                       ---%ROWCOUNT(然后当前游标所指向的行位置)

 dbms_output.putline(name);

endLOOP;

rsCursor:

=cursor;

endtest;

下面写一个简单的例子来对以上所说的存储过程的用法做一个应用:

现假设存在两张表,一张是学生成绩表(studnet),字段为:

stdId,math,article,language,music,sport,total,average,step                 一张是学生课外成绩表(out_school),字段为:

stdId,parctice,comment

通过存储过程自动计算出每位学生的总成绩和平均成绩,同时,如果学生在课外课程中获得的评价为A,就在总成绩上加20分。

createorreplaceprocedureautocomputer(stepinnumber)is

rsCursorSYS_REFCURSOR;

commentArraymyPackage.myArray;

mathnumber;

articlenumber;

languagenumber;

musicnumber;

sportnumber;

totalnumber;

averagenumber;

stdIdvarchar(30);

recordmyPackage.stdInfo;

inumber;

begin

i:

=1;

get_comment(commentArray);--调用名为get_comment()的存储过程获取学生课外评分信息

OPENrsCursorforselectstdId,math,article,language,music,sportfromstudenttwheret.step=step;

LOOP

fetchrsCursorintostdId,math,article,language,music,sport;exitwhenrsCursor%NOTFOUND;

total:

=math+article+language+music+sport;

foriinmentArray.countLOOP 

 record:

=commentArray(i);    

ifstdId=record.stdIdthen  

 begin     

 ifment='A'then     

  begin         

 total:

=total+20;   

   gotonext;--使用goto跳出for循环       

 end;    

endif;  

end;  

endif;

endLOOP;

<> average:

=total/5;

 updatestudenttsett.total=totalandt.average=averagewheret.stdId=stdId;

endLOOP;

end;

endautocomputer;

--取得学生评论信息的存储过程

createorreplaceprocedureget_comment(commentArrayoutmyPackage.myArray)is

rsSYS_REFCURSOR;

recordmyPackage.stdInfo;

stdIdvarchar(30);

commentvarchar

(1);

inumber;

begin

openrsforselectstdId,commentfromout_school

i:

=1;

LOOP

 fetchrsintostdId,comment;exitwhenrs%NOTFOUND;

record.stdId:

=stdId;

 ment:

=comment;

recommentArray(i):

=record;

i:

=i+1;

endLOOP;

endget_comment;

--定义数组类型myArray

createorreplacepackagemyPackageisbegin

typestdInfoisrecord(stdIdvarchar(30),commentvarchar

(1));

typemyArrayistableofstdInfoindexbybinary_integer;

endmyPackage;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 卡通动漫

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1