--创建表 declare num number; begin selectcount(1) into num from user_tables where table_name='SRCT'; --判断当前要创建的表在数据库中是否存在. if num>0 thenexecute immediate 'drop table '||'SRCT'; --表名要大写 endif; execute immediate 'CREATE TABLE SRCT ( SN char(11), XM varchar2(30), --姓名 KSCJ number(3), --考试成绩 KSRQ Date --考试日期 )'; end; / commit; / --注:上面的表名要大写.
--插入数据 declare maxrecords constant int:=50; i int:=1; begin for i in1..maxrecords loop insertinto SRCT(SN,XM,KSCJ,KSRQ)values(i,'frj'||i,i+10,sysdate); end loop --dbms_output.put_line('成功录入数据!'); commit; end; / --查询数据,检查数据插入操作是否成功. SELECT*FROM SRCT WHERE ROWNUM<3; /
--检查存储过程是否存在 declare num number; msg varchar2(30):='数据库中不存在该存储过程'; begin selectcount(1) into num from user_objects where object_type ='PROCEDURE' andobject_name='WRITE_SRC' ; if num>0 then msg:='该存储过程已经存在'; endif; dbms_output.put_line(msg); end ; /
--创建存储过程 CREATEORREPLACEProcedure WRITE_SRC( M_SN inchar , M_XM invarchar2,M_KSCJ ininteger, M_KSRQ in Date,RES out integer,ERR out varchar2) as V_COUNT number:=0; Begin RES:=-2; ERR:='数据库中不存在该纪录,更新失败.'; selectcount(SN) INTO V_COUNT FROM SRCT Where SN=M_SN AND XM=M_XM; IF V_COUNT>0THEN Update SRCT Set KSCJ=M_KSCJ,KSRQ=M_KSRQ Where SN=M_SN AND XM=M_XM; Commit; RES:=1; ERR:='更新成功!'; return; ENDIF; exception when others then RES:=-1; ERR:='更新失败'; return ; End ; / commit; /
--调用存储过程 declare res int; err Varchar2(80); Begin res:='3'; err:='更新成功'; WRITE_SRC('1','frj1',300,sysdate,res,err); COMMIT; dbms_output.put_line(res); dbms_output.put_line(err); End; / select sn,xm,kscj from srct WHERE SN='1'AND XM='frj1'; /
--注:易犯错误 --以上语句均在"SQL*Plus 工作单"上运行; 1.每一个小单元的语句后要加';'号; 2.不能将字符串赋值的单引号写成双引号; 如: err:='更新成功!'; 不能写成 err:="更新成功!"; 以上错误系统将提示:"警告: 创建的过程带有编译错误。" 3.存储过程传递与赋值的参数名称,个数,类型(字段类型,返回的类型(in/out))要与调用的存储过程以及该存储过程 所访问的表中相应的字段类型严格对应. 还有一些约定的写法也需遵守. 如:其中的" M_KSCJ "对应表中的" KSCJ "字段, 应写成(M_KSCJ ininteger)不能写成( M_KSCJ innumber(3)); "M_SN"对应表中的 "SN" 字段,应写成 (M_SN inchar) 不能写成 (M_SN inVarchar2) 4.在c#中进行调用时,还要注意它的输入/输出类型,如上例中的" out integer res " 为输出类型,应将其 OracleParameter[] parm = new OracleParameter[1]; parm[0]= new OracleParameter("RES", OracleType.Int16 ); parm[0].Direction = ParameterDirection.Output ; --将其设为输出类型; 具体调用方法将在稍后进行介绍; 5.定义存储过程时,其参数名称最好不要与字段名称同名(不区分大小写); 如上面的存储过程建议不要写成: WRITE_SRC( SN inchar , XM invarchar2,KSCJ ininteger, KSRQ in Date,RES out integer,ERR out varchar2)
--按时间段分页显示 select sn,xm,kscj,ksrq from SRCT where ksrq between to_date('2003-01-01','yyyy-mm-dd') and to_date('2007-06-28','yyyy-mm-dd') orderby ksrq; / select*from ( select b.*,rownum row_num from ( select sn,xm,kscj,ksrq from SRCT c where ksrq between to_date('2003-01-01','yyyy-mm-dd') and to_date('2007-06-28','yyyy-mm-dd') orderby c.sn )b )a where a.row_num between1and10; / --注: oracle的rownum是在提取记录时就已经生成,它先于排序操作,所以必须使用子查询先排序.
--==转oracle分页存储过程== CREATEORREPLACE PACKAGE DotNet is TYPE type_cur IS REF CURSOR; --定义游标变量用于返回记录集 PROCEDURE DotNetPagination ( Pindex innumber, --分页索引 Psql invarchar2, --产生dataset的sql语句 Psize innumber, --页面大小 Pcount out number, --返回分页总数 v_cur out type_cur --返回当前页数据记录 ); procedure DotNetPageRecordsCount ( Psqlcount invarchar2, --产生dataset的sql语句 Prcount out number--返回记录总数 ); end DotNet; / CREATEORREPLACE PACKAGE BODY DotNet is --*************************************************************************************** PROCEDURE DotNetPagination ( Pindex innumber, Psql invarchar2, Psize innumber, Pcount out number, v_cur out type_cur ) AS v_sql VARCHAR2(1000); v_count number; v_Plow number; v_Phei number; Begin ------------------------------------------------------------取分页总数 v_sql :='select count(*) from ('|| Psql ||')'; execute immediate v_sql into v_count; Pcount := ceil(v_count/Psize); ------------------------------------------------------------显示任意页内容 v_Phei := Pindex * Psize + Psize; v_Plow := v_Phei - Psize +1; --Psql := 'select rownum rn,t.* from cd_ssxl t' ; --要求必须包含rownum字段 v_sql :='select * from ('|| Psql ||') where rn between '|| v_Plow ||' and '|| v_Phei ; open v_cur for v_sql; End DotNetPagination; --************************************************************************************** procedure DotNetPageRecordsCount ( Psqlcount invarchar2, Prcount out number ) as v_sql varchar2(1000); v_prcount number; begin v_sql :='select count(*) from ('|| Psqlcount ||')'; execute immediate v_sql into v_prcount; Prcount := v_prcount; --返回记录总数 end DotNetPageRecordsCount; --************************************************************************************** end DotNet; /