首页  电脑故障排除  病毒安全 电脑基础知识  硬件知识  软件应用知识  操作系统知识  编程程序

美国编程网址 日本编程网址 法国编程网址 德国编程网址 韩国编程网址 香港编程网址 台湾编程网址

您的位置:首页>>编程程序>>Oracle

请大家一起整理oracle中的经常用到的包

 
请大家一起整理oracle中的经常用到的包
  
  oracle中有很多经常用到的包,他们功能强大,能够完成很多复杂,和不可想象的任务,所以我想请大家帮忙整理出来,不管是高手还是新人只要有对某个包比较熟悉,或者对他的一种使用方法比较熟悉,请帮忙跟贴,对大家的管理工作应该都会有很大帮助的。我先抛砖引玉写一个,希望版主和同志们帮忙。
------------------------------------------------------------------------------------
DBMS_SQL
一:)带有参数及解释
1、OPEN_CURSOR:返回新游标的ID值
2、PARSE:解析要执行的语句
3、BIND_VARIABLE:将给定的数量与特定的变量相连接
4、DEFINE_COLOUMN:定义字段变量,其值对应于指定游标中某个位置元素的值
(仅用于SELECT语句)
5、EXECUTE:执行指定的游标
6、EXECUTE_AND_FETCH:执行指定的游标并取记录
7、FETCH_ROWS:从指定的游标中取出记录
8、COLUMN_VALUE:返回游标中指定位置的元素
9、IS_OPEN:当指定的游标状态为OPEN时返回真值
10、CLOSE_CURSOR:关闭指定的游标并释放内存
11、LAST_ERROR_POSITION:返回出错SQL语句的字节偏移量
12、LAST_ROW_ID:返回最后一条记录的ROWID
13、LAST_SQL_FUNCTION_CODE:返回语句的SQLFUNCTIONCODE
二:使用实例:
CREATEORREPLACE
proceduredml_sql(the_rqvarchar2)as
The_c1Integer;
The_resultInteger;--dml_sql_result
M_jlsnumber;
The_xhvarchar2(2);
Begin
The_xh:=lpad(ltrim(the_rq),2,'0');
The_C1:=Dbms_sql.open_cursor;
Dbms_sql.parse(the_C1,'selectcount(*)fromuser_indexes
wheretable_name=''ZDCHB'''||the_xh,dbms_sql.v7);
Dbms_sql.define_column(the_c1,1,M_jls);
The_result:=Dbms_sql.execute(The_c1);
Ifdbms_sql.fetch_rows(cursor1)>0then
Dbms_sql.column_value(cursor1,1,M_jls);
Endif;
Dbms_sql.close_cursor(The_C1);
End;
大家不一定按这个模式来,也不一定要写的这么复杂,知道多少就写多少,整理出来,以后如果能够想用什么包到chinaunix里都能查到,就好了,呵呵!
  
  
  
  txfy 回复于:2003-09-16 15:03:09
二:dbms
DBMS_JOB包介绍
调度任务队列里的任务要使用DBMS_JOB包中的过程。使用任务队列不需要特别的数据库特权。任何可以使用这些过程的用户都可以使用任务队列。
1:参数
SUBMIT
--向任务队列提交一个任务
REMOVE
--从任务队列中删除指定的任务
CHANGE
--改变任务
WHAT
--改变指定任务的任务内容
NEXT_DATE
--改变指定任务的下一次执行时间
INTERVAL
--改变指定任务的执行时间间隔。
BROKEN
--禁止指定任务的执行
RUN
--强制执行指定的任务
----------------------------------------------------------------------------------------------------------------------
2:使用方法
1)向任务队列提交一个任务(submit)
DBMS_JOB.SUBMIT(jobOUTBINARY_INTEGER,
whatINVARCHAR2,
next_dateINDATEDEFAULTSYSDATE,
intervalINVARCHAR2DEFAULT'null',
no_parseINBOOLEANDEFAULTFALSE)
其中interval指定方式为:
'SYSDATE+7'每7天一次
'SYSDATE+1/48'每半个小时一次
'NEXT_DAY(TRUNC(SYSDATE),''MONDAY'')+15/24'每个礼拜一的下午3点执行
'NEXT_DAY(ADD_MONTHS(TRUNC(SYSDATE,''Q''),3),''THURSDAY'')'每个季度的第一个星期四
2)删除任务队列中的任务(remove)
DBMS_JOB.REMOVE(jobINBINARY_INTEGER)
Thefollowingstatementremovesjobnumber14144fromthejobqueue:
DBMS_JOB.REMOVE(14144);
3)指定任务的任务内容(WHAT)
DBMS_JOB.WHAT(jobINBINARY_INTEGER,
whatINVARCHAR2)
4)指定下次执行时间,如果你暂时不想让它执行可以设成3004年,呵呵!(next_date)
DBMS_JOB.NEXT_DATE(jobINBINARY_INTEGER,
next_dateINDATE)
5)指定任务的执行时间间隔(NTERVAL)
DBMS_JOB.INTERVAL(jobINBINARY_INTEGER,
intervalINVARCHAR2)
-----------------------------------------------------------------------------------------------------------------------
3:查询状态
显示任务的状态和失败执行的次数。
SELECTjob,next_date,next_sec,failures,broken
FROMuser_jobs;
JOBNEXT_DATENEXT_SECFAILURESB
--------------------------------------
912501-NOV-9400:00:004N
1414424-OCT-9416:35:350N
4176201-JAN-0000:00:0016Y
显示当前运行的任务的信息。
SELECTsid,r.job,log_user,r.this_date,r.this_sec
FROMdba_jobs_runningr,dba_jobsj
WHEREr.job=j.job;
SIDJOBLOG_USERTHIS_DATETHIS_SEC
---------------------------------------------------------
1214144JFEE24-OCT-9417:21:24
258536SCOTT24-OCT-9416:45:12
xihen2002 回复于:2003-09-16 16:44:09
支持,我是ORACLE初学者,请问ORACLE的包有何作用,谢谢
rollingpig 回复于:2003-09-17 09:23:51
有关oracleSuppliedPL/SQLPackages的详细资料,包含在oracledocument里
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96612/toc.htm
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96612.pdf
大家可以参考,然后把实际用法给整理一下
:D
txfy 回复于:2003-09-17 10:43:26
我怎么怎么看怎么觉得rolling兄象oracle800热线支持的,呵呵!
rollingpig 回复于:2003-09-17 11:18:18

xyz123 回复于:2003-09-17 11:55:22
good
pcerma 回复于:2003-09-18 12:12:23
太多了,
需要用的时候再去找吧
chinesehuman 回复于:2003-09-21 10:30:19
想法很好啊
mosquitoxh 回复于:2003-09-25 12:26:04
我有全部的,
不过日文的
gxl218 回复于:2003-09-27 10:32:57
[quote:dc401586cb="rollingpig"]有关oracleSuppliedPL/SQLPackages的详细资料,包含在oracledocument里
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96612/toc.htm
http://download-west.oracle.com/docs/cd/B10501_01/..........[/quote:dc401586cb]
兄:我怎么进不去啊!
rollingpig 回复于:2003-09-27 11:34:34
你可能需要先在otn.oracle.com注册吧
nokilled 回复于:2003-09-27 22:26:43
支持楼主
可怜的小妹 回复于:2003-09-28 16:55:38
我down下来了,但很晕:2008页啊!
木言 回复于:2003-09-29 21:04:26
大家去买译本TOM的《expertoneononeoralce》,里面大部分都有
liangxinf 回复于:2003-10-10 10:39:31
跟帖得太少
horse 回复于:2003-11-07 16:57:24
精华就是精华,很好。
mosquitoxh 回复于:2004-01-03 21:15:56
PL/SQL中使用动态SQL编程
作者:FLYTIGER
在PL/SQL程序设计过程中,会遇到很多必须使用动态sql的地方,oracle系统所提供的DMBS_SQL包可以帮助你解决问题。
(一)介绍
DBMS_SQL系统包提供了很多函数及过程,现在简要阐述其中使用频率较高的几种:
functionopen_cursor:打开一个动态游标,并返回一个整型;
procedureclose_cursor(cinoutinteger);关闭一个动态游标,参数为open_cursor所打开的游标;
procedureparse(cininteger,statementinvarchar2,language_flagininteger):对动态游标所提供的sql语句进行解析,参数C表示游标,statement为sql语句,language-flag为解析sql语句所用oracle版本,一般有V6,V7跟native(在不明白所连database版本时,使用native);
proceduredefine_column(cininteger,positionininteger,columnanydatatype,[column_sizeininteger]):定义动态游标所能得到的对应值,其中c为动态游标,positon为对应动态sql中的位置(从1开始),column为该值所对应的变量,可以为任何类型,column_size只有在column为定义长度的类型中使用如VARCHAR2,CHAR等(该过程有很多种情况,此处只对一般使用到的类型进行表述);
functionexecute(cininteger):执行游标,并返回处理一个整型,代表处理结果(对insert,delete,update才有意义,而对select语句而言可以忽略);
functionfetch_rows(cininteger):对游标进行循环取数据,并返回一个整数,为0时表示已经取到游标末端;
procedurecolumn_value(cininteger,positionininteger,value):将所取得的游标数据赋值到相应的变量,c为游标,position为位置,value则为对应的变量;
procedurebind_variable(cininteger,nameinvarchar2,value):定义动态sql语句(DML)中所对应字段的值,c为游标,name为字段名称,value为字段的值;
以上是在程序中经常使用到的几个函数及过程,其他函数及过程请参照oracle所提供定义语句dbmssql.sql
(二)一般过程
对于一般的select操作,如果使用动态的sql语句则需要进行以下几个步骤:
opencursor--->parse--->definecolumn--->excute--->fetchrows--->closecursor;
而对于dml操作(insert,update)则需要进行以下几个步骤:
opencursor--->parse--->bindvariable--->execute--->closecursor;
对于delete操作只需要进行以下几个步骤:
opencursor--->parse--->execute--->closecursor;
(三)具体案例
下面就本人所开发系统中某一程序做分析
该过程为一股票技术曲线计算程序,将数据从即时数据表中取出,并按照计算曲线的公式,对这些数据进行计算,并将结果保存到技术曲线表中.
--**********************************
--procedurename:R_Ma_Main
--入口参数:PID股票代码,PEND时间,pinterval时间间隔,totab目标数据表
--调用函数:R_GetSql1,R_GetSql2
--功能:具体计算单支股票ma技术曲线
--时间:2001-06-20
--**********************************
createorreplaceprocedureR_Ma_Main
(
pidvarchar2,
pendvarchar2,
pintervalvarchar2,
totabvarchar2
)is
--定义数组
typeDate_typeistableofvarchar2(12)indexbybinary_integer;
typeIndex_typeistableofnumberindexbybinary_integer;
TempDateDate_Type;--时间数组
TempIndexIndex_Type;--股票收盘价数组
TempMaIndex_Type;--ma技术曲线数据
cursor1integer;--游标
cursor2integer;--游标
rows_processedinteger;--执行游标返回
TempInterinteger;--参与计算数值个数
TempValinteger;--计算时间类型
TempSqlvarchar2(500);--动态sql语句
MyTimevarchar2(12);--时间
MyIndexnumber;--数值
MidIndexnumber;--中间变量
iinteger:=999;
jinteger;
begin
TempInter:=to_number(substr(pinterval,1,4));
TempVal:=to_number(substr(pinterval,5,2));
TempSql:=R_GetSql1(pid,pend,TempVal);--得到选择数据的sql语句
--得到当天的即时数据,并依次保存到数组中
cursor1:=dbms_sql.open_cursor;--创建游标
dbms_sql.parse(cursor1,TempSql,dbms_sql.native);--解析动态sql语句,取两个字段,时间及价格,其中时间以14位的varchar2表示
dbms_sql.define_column(cursor1,1,MyTime,12);--分别定义sql语句中各字段所对应变量
dbms_sql.define_column(cursor1,2,MyIndex);
rows_processed:=dbms_sql.execute(cursor1);
loop
ifdbms_sql.fetch_rows(cursor1)>0then
begin
dbms_sql.column_value(cursor1,1,MyTime);
dbms_sql.column_value(cursor1,2,MyIndex);
TempDate(i):=MyTime;
TempIndex(i):=MyIndex;
i:=i-1;--按倒序的方法填入数组
end;
else
exit;
endif;
endloop;
dbms_sql.close_cursor(cursor1);
--如果取得的数据量不够计算个数,则跳出程序
ifi>999-TempInterthen
gotoJumpLess;
endif;
--初始化中间变量
MidIndex:=0;
TempIndex(i):=0;
forjini..i+TempInter-1loop
MidIndex:=MidIndex+TempIndex(j);
endloop;
--依次对当天数据计算ma值,并保存到ma数组中
forjini+TempInter..999loop
MidIndex:=MidIndex-TempIndex(j-TempInter)+TempIndex(j);
TempMa(j):=MidIndex/TempInter;
endloop;
ifTempVal<6then--如果计算的是分钟跟天的ma技术曲线
begin
cursor2:=dbms_sql.open_cursor;
TempSql:='insertinto'||totab||'values(:r_no,:i_interval,:i_time,:i_index)';
dbms_sql.parse(cursor2,TempSql,dbms_sql.native);
forjini+TempInter..999loop
dbms_sql.bind_variable(cursor2,'r_no',pid);
dbms_sql.bind_variable(cursor2,'i_interval',pinterval);
dbms_sql.bind_variable(cursor2,'i_time',TempDate(j));
dbms_sql.bind_variable(cursor2,'i_index',TempMa(j));
rows_processed:=dbms_sql.execute(cursor2);--插入数据
endloop;
end;
endif;
commit;
dbms_sql.close_cursor(cursor2);
--数据量不足跳出
<<JumpLess>>
null;
--exception处理,无关本话题
end;
/
(四)个人观点
在使用dbms_sql系统包的过程中,其方法简单而又不失灵活,但还是需要注意一些问题:
1,在整个程序的设计过程中,对游标的操作切不可有省略的部分,一旦省略其中某一步骤,则会程序编译过程既告失败,如在程序结尾处未对改游标进行关闭操作,则在再次调用过程时会出现错误.
2,dbms_sql除了可以做一般的select,insert,update,delete等静态的sql做能在过程中所做工作外,还能执行create等DDL操作,不过在执行该类操作时应首先显式赋予执行用户相应的系统权限,比如createtable等.该类操作只需opencursor--->prase--->closecursor即能完成.
以上为本人在工作中对dbms_sql的一点点看法,不到之处,请予指正.
对于想更深了解dbms_sql的朋友,请阅读dbmssql.sql文件.
octopusyu 回复于:2004-04-14 09:10:04
强,我们现在开始用oracle,但后悔当初没有学,不过这里也很丰富的!呵呵,谢谢楼主!
  

查看上一页  返回分类首页 返回96PC首页  查看下一页

  版权所有:电脑知识大全 网站备案:粤ICP备07031496号  联系我们

友情链接:母婴知识  外贸商务网  娱乐频道  汽车维修知识  股票入门知识  游戏攻略秘籍  本站空间由安信网络提供