当前位置:  数据库>其它
本页文章导读:
    ▪ORACLE日期函数      Oracle PL/SQL Oracle的日期函数 常用日期型函数 1。Sysdate 当前日期和时间 SQL> Select sysdate from dual; SYSDATE ---------- 21-6月 -05 2。Last_day 本月最后一天 SQL> Select last_day(sysdate) from dual; LAST_DAY(S -.........
    ▪java使用xquery      在使用关系数据库时,我们通过sql语句来检索数据源,这没有任何问题,但是关系数据也存在着一定的局限性,只能存储结构化的数据 当数据集是非结构化的时候该怎样存储呢,最简单的办.........
    ▪使用存储过程实现导出指定数据到文件(仿EXP)      由于EXP不能导出表的指定字段(其实也可通过CREATE TABLE  tablename AS SELECT...来间接实现),故自己写了个存储来实现这个功能. /* 描述:按指定条件导出指定表的指定列的数据到指定文件(增强了EXP.........

[1]ORACLE日期函数
    来源: 互联网  发布时间: 2013-11-07

Oracle PL/SQL Oracle的日期函数


常用日期型函数
1。Sysdate 当前日期和时间
SQL> Select sysdate from dual;

SYSDATE
----------
21-6月 -05

2。Last_day 本月最后一天
SQL> Select last_day(sysdate) from dual;

LAST_DAY(S
----------
30-6月 -05

3。Add_months(d,n) 当前日期d后推n个月
用于从一个日期值增加或减少一些月份
date_value:=add_months(date_value,number_of_months)

SQL> Select add_months(sysdate,2) from dual;

ADD_MONTHS
----------
21-8月 -05

4。Months_between(f,s) 日期f和s间相差月数
SQL> select months_between(sysdate,to_date('2005-11-12','yyyy-mm-dd'))from dual;

MONTHS_BETWEEN(SYSDATE,TO_DATE('2005-11-12','YYYY-MM-DD'))
----------------------------------------------------------
                                                 -4.6966741

5。NEXT_DAY(d, day_of_week)
返回由"day_of_week"命名的,在变量"d"指定的日期之后的第一个工作日的日期。参数"day_of_week"必须为该星期中的某一天。
SQL> SELECT next_day(to_date('20050620','YYYYMMDD'),1) FROM dual;

NEXT_DAY(T
----------
26-6月 -05

6。current_date()返回当前会话时区中的当前日期
date_value:=current_date
SQL> column sessiontimezone for a15
SQL> select sessiontimezone,current_date from dual;

SESSIONTIMEZONE CURRENT_DA
--------------- ----------
+08:00 13-11月-03
  
SQL> alter session set

    
[2]java使用xquery
    来源: 互联网  发布时间: 2013-11-07
在使用关系数据库时,我们通过sql语句来检索数据源,这没有任何问题,但是关系数据也存在着一定的局限性,只能存储结构化的数据
当数据集是非结构化的时候该怎样存储呢,最简单的办法就是封装成xml。
应用开发中我们经常使用xml作为数据源来存储一些非结构化的数据,然而是否存在一种语言可以像sql语句检索关系数据库一样来检索xml呢?答案就是xquery。

xquery本身的语法结构并不复杂,xml节点位置是通过xpath进行描述的,在辅以相应的逻辑表达式,满足用户的检索偏好设置。
有关xquery和xpath的教程可参考如下网址
http://www.w3school.com.cn/xpath/index.asp
http://www.w3school.com.cn/xquery/index.asp
几个比较基础的语法信息如下:
xpath中通过'/'来表示节点层级结构,'//'表示所有节点
节点过滤条件写在'[ ]'里
节点属性加@符
如//person[@name='zhangsan']/password 表示获取姓名为zhangsan的用户密码
对应的xml结构是这样的<root><person name="zhangsan"><password>mima</password></person> person...</root>

xquery中
where语句用来指定过滤条件
return语句用来设置返回的结果集
for语句用来执行遍历
where和return子句里都可以加if/else条件判断逻辑
几个比较常用的功能函数:
    data(element):返回节点的text
    contains(element,value):查询模糊匹配
    doc(filePath):加载xml数据文件
如:
for $x in doc("persons.xml")//person
where $x/@age > 20 and contains($x/@name,'张')
return if($x/@sex='男') then data($x/password) else ()
表示:
查询姓张并且年龄大于20的人,如果是男性返回密码,如果是女性返回空

javaAPI使用
这里主要使用saxon来执行xquery,具体应用可参考如下网址:
http://www.cs.duke.edu/courses/fall08/cps116/docs/saxon/samples/java/XQJExamples.java
saxon的jar包可到这里下载:
http://download.csdn.net/detail/javaman_chen/5107221
使用大致如下:
//首先获取xml的数据源连接
XQDataSource ds = new SaxonXQDataSource();
XQConnection conn = ds.getConnection();
//通过XQExpression执行xquery
XQExpression expression = conn.createExpression();
XQResultSequence res=expression.executeQuery("doc(persons.xml)//person....");
//处理结果集
while(res.next()){
    res.getObject();
}

另外:
xquery的doc()函数需要传递xml的文档路径,然而在开发时,我们的xml数据源可能还没有生成文件,对此,XQExpression提供了API,可以直接绑定xml数据而不用加载xml文档
expression.bindNode(XQConstants.CONTEXT_ITEM, org.w3c.dom.Document doc, null);
doc对象可通过DocumentBuilder类生成
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc=db.parse(new ByteArrayInputStream("<person>zhangsan</person>".getBytes()));

作者:JavaMan_chen 发表于2013-3-4 11:11:07 原文链接
阅读:0 评论:0 查看评论

    
[3]使用存储过程实现导出指定数据到文件(仿EXP)
    来源: 互联网  发布时间: 2013-11-07

由于EXP不能导出表的指定字段(其实也可通过CREATE TABLE  tablename AS SELECT...来间接实现),故自己写了个存储来实现这个功能.

/*
描述:按指定条件导出指定表的指定列的数据到指定文件(增强了EXP工具,exp不能直接导出指定字段的数据)
created by cryking 2013.03.03
注意:1.本存储建议由SYS账户或具有SYSDBA权限的账户执行
     2.不要在其他事务中运行本存储过程
     3.null值导出后为'null'
    4.指定字段分隔符不能在导出的字段数据中有,否则会报错
     5.注意系统会自动创建或覆盖目录名为EXPDIR的目录,所以在执行存储之前检查一下是否有目录名为EXPDIR的目录
*/
create or replace procedure exp_data
(
  file_name in varchar2 --要导出的文件名
 ,path_name in varchar2 --路径
 ,p_user    in varchar2 --要导出的用户
 ,p_table   in varchar2 --要导出的表
 ,p_filed   in varchar2 default '*' --要导出的字段,逗号分隔,默认为所有字段
 ,p_sep     in varchar2 default ',' --字段分隔符,默认为逗号
 ,p_where   in varchar2 default ' ' --条件,注意要写'WHERE'
) AS
  v_file UTL_FILE.file_type;
  TYPE t_filed IS TABLE OF varchar2(200) INDEX BY BINARY_INTEGER;
  v_filed  t_filed;
  v_sql    varchar2(30000);
  v_cursor integer;
  v_col    varchar2(4000);
  i_exe    integer;
  v_sid    integer;
  v_SERIAL integer;

  exp_sep exception;

BEGIN
  rollback; --防止在其他事务中运行本存储,先回滚之前的事务
  execute immediate 'create or replace directory EXPDIR as ''' || path_name ||
                    ''' '; --创建目录

  v_file := UTL_FILE.fopen('EXPDIR', file_name, 'w');
  select * bulk collect into v_filed from table(splitstr(p_filed, ','));
  for i in 1 .. v_filed.count
  loop
    utl_file.putF(v_file, v_filed(i)); --写表字段到文件
    utl_file.put(v_file, p_sep); --输出字段分隔符
  end loop;
  utl_file.new_line(v_file);

  v_sql    := 'select ' || p_filed || ' from ' || p_user || '.' || p_table ||
              p_where;
  v_cursor := DBMS_SQL.OPEN_CURSOR; --获得游标
  DBMS_SQL.PARSE(v_cursor, v_sql, DBMS_SQL.NATIVE); --解析sql

  for j in 1 .. v_filed.count
  loop
    --定义列
    DBMS_SQL.DEFINE_COLUMN(v_cursor, j, v_col, 4000);
    --dbms_output.put_LINE(v_col);
  end loop;

  i_exe := DBMS_SQL.EXECUTE(v_cursor);

  while (DBMS_SQL.FETCH_ROWS(v_cursor))>0 loop
    for k in 1 .. v_filed.count
    loop
      DBMS_SQL.COLUMN_VALUE(v_cursor, k, v_col);
      --dbms_output.put_LINE(v_col);
      if instr(v_col, p_sep) > 0
      then
        raise exp_sep;
      end if;
      utl_file.putF(v_file,
                    case when v_col is NULL then 'null' else v_col end);
      utl_file.put(v_file, p_sep); --输出字段分隔符
    END LOOP;
    utl_file.new_line(v_file);
  END LOOP;
  UTL_FILE.fclose(v_file);
  DBMS_OUTPUT.put_line('导出数据成功完成!');

EXCEPTION
  when exp_sep then
    raise_application_error(-20001,
                            '导出的数据中包含了指定的字段分隔符:' || p_sep || ',请更换字段分隔符!');
  WHEN OTHERS THEN
    DBMS_OUTPUT.put_line('导出数据失败');
    UTL_FILE.fclose(v_file);
    raise;
END exp_data;


 测试:

SYS用户登入:

执行

begin
  exp_data('exp_0303.txt', 'd:\test', 'scott', 'emp', 'ename,empno');
end;

来实现导出SCOTT下的表EMP的字段ENAME和EMPNO,看到“导出数据成功完成!”后,打开文件exp_0303.txt,看到内容:

ename,empno,
smith,7369,
allen,7499,
ward,7521,
jones,7566,
martin,7654,
blake,7698,
clark,7782,
scott,7788,
king,7839,
turner,7844,
adams,7876,
james,7900,
ford,7902,
miller,7934,

...

执行
begin

exp_data('exp_0303.txt', 'd:\test', 'scott', 'emp', 'ename,empno',',','where empno=7788');

end;

来实现按条件导出指定数据,完成后打开文件,内容如下:

ename,empno,
scott,7788,

 

执行
begin

exp_data('exp_0303.txt', 'd:\test', 'scott', 'emp');

end;

来导表EMP的所有数据,完成后打开文件内容如下:

EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,
7369,smith,CLERK,7902,17-12月-80,1200,null,20,
7499,allen,SALESMAN,7698,20-2月 -81,2400,300,30,
7521,ward,SALESMAN,7698,22-2月 -81,1875,500,30,
7566,jones,MANAGER,7839,02-4月 -81,4462.5,null,20,
7654,martin,SALESMAN,7698,28-9月 -81,1875,1400,30,
7698,blake,MANAGER,7839,01-5月 -81,4275,null,30,
7782,clark,MANAGER,7839,09-6月 -81,3675,null,10,
7788,scott,ANALYST,7566,19-4月 -87,184.5,null,20,
7839,king,PRESIDENT,null,17-11月-81,7500,null,10,
7844,turner,SALESMAN,7698,08-9月 -81,2250,0,30,
7876,adams,CLERK,7788,23-5月 -87,1650,null,20,
7900,james,CLERK,7698,03-12月-81,1425,null,30,
7902,ford,ANALYST,7566,03-12月-81,4500,null,20,
7934,miller,CLERK,7782,23-1月 -82,1950,null,10,

 

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

如有BUG,欢迎指出.


 

 

作者:edcvf3 发表于2013-3-4 14:09:05 原文链接
阅读:0 评论:0 查看评论

    
最新技术文章:
▪gc buffer busy/gcs log flush sync与log file sync    ▪让你的PL/SQL更好用    ▪ADO.NET中的非脱机数据库查询
▪参数job_queue_processes与Oracle jobs    ▪11gR2游标共享新特性带来的一些问题以及_cursor...    ▪_library_cache_advice和latch:shared pool、latch:shared poo...
▪SQL: Date Utility    ▪DB2 分区表增加分区    ▪DB2第一步 — 创建表
▪oracle 数据库    ▪插入10万条记录测试    ▪rebuild index VS. rebuild index online
▪如何处理undo tablespace 表空间太大的问题    ▪ado执行存储过程中包含结果集获取输出参数为...    ▪oracle函数的demo
▪Entity Framework 学习建议及自学资源    ▪存储过程的编写    ▪Linux/Unix shell 自动发送AWR report(二)
▪第二章 Oracle恢复内部原理(基础数据结构)    ▪Redis源码学习之【Tcp Socket封装】    ▪Java Jdbc减少与Oracle之间交互提升批量处理性能...
▪南大通用GBase8a Vs Oracle11g 单机测试亲测    ▪oracle 中行列转换    ▪rhel下安装oracle10g+asm---测试环境搭建
▪Redis系列-主从复制配置    ▪MySQL索引与查询优化    ▪INDEX受到NULL值的影响
▪测试人员的SQL语言 系列    ▪SQL数据库基本语句    ▪MySQL Replication常见错误整理[持续更新...]
▪eclipse下建立esper的demo    ▪把oracle rac 转化为单机数据库    ▪Redis系列-存储篇sorted set主要操作函数小结
▪基本的SQL*Plus报表和命令    ▪druid简单教程    ▪11g调度--scheduler使用
▪EF基础一    ▪db2存储过程中循环语句while do的continue有没有...    ▪oracle 创建DBLINK
▪DB2数据库备份还原    ▪Warning: prerequisite DBD::mysql 1 not found错误解决方...    ▪innotop性能监视mysql,innodb工具
▪数据迁移:DataGuard配置    ▪QX项目实战-19.跨库数据同步    ▪Mysql EXPLAIN
▪Oracle 11g AWR 系列七:Active Session History (ASH) 报...    ▪Oracle 11G新特性(共36个)    ▪父子节点问题
▪OEM简介及按钮乱码问题    ▪NoSql之MongoDB的常用类管理    ▪ORA-39700: database must be opened with UPGRADE option
▪node.js 访问redis数据库,pub/sub    ▪使用DBMS_REDEFINITION在线重定义分区表    ▪SQL Developer 使用问题与解决方法汇总
▪oralce 11g dataguard 概念    ▪ORA-30004 错误处理    ▪oracle分组函数rollup,cube
▪Sql Developer 使用问题与解决方法汇总    ▪Configure Oracle Dataguard Primary-ASM to Physical-ASM    ▪Oracle Data Guard 理论知识
▪Control File 恢复    ▪Oracle数据文件收缩    ▪Oracle 11g AWR 系列五:如何生成 AWR 报告?
▪Wireshark数据包分析实战(第2版)    ▪MySql用户权限控制    ▪db2和oracle查询序列区别
▪更新blob字段的存储过程    ▪MySQLReport分析报告三    ▪DB2中的序列
▪Oracle中DBMS_RANDOM.STRING 的用法    ▪SQL SERVER无法安装成功,sqlstp.log文件提示[未发...    ▪Data Guard 部署物理备库的 10 大注意事项
▪万能数据库查询分析器使用技巧之(九)    ▪SQL 自定义Split函数    ▪视图 v$sql,v$sqlarea,$sqltext,v$sqltext_with_newlines 的...
▪Data Guard Standby_archive_dest 和 Log_archive_dest_n 的...    ▪机房收费系统数据库设计(一)    ▪利用putty的SSH tunnel连接Oracle
▪DBCA建库偶遇ORA-27125    ▪使用PowerPivot建立简单的分析模型    ▪Linux/Unix shell 自动发送AWR report
▪写入到blob字段的存储过程    ▪关于JDBC中ResultSet接口的一点细节探究    ▪Data Guard 配置 Standby Redo Log
▪linux下redis的安装    ▪windows下redis的安装    ▪手动创建数据库步骤(简单翻译官方文档)
▪Ubuntu安装Mongodb    ▪SQL CLR应用    ▪redis的配置文件参数--详细说明
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3