利用oracle的dbms_random包结合rownum来实现,示例如下,随机取499户:
select * from ( select * from busi.t_ar_userinfo order by
dbms_random.value) where rownum < 500;
有关dbms_random的参考文献,链接为:
Deprecated. Use the methods in the DBMS_CRYPTO built-in
package,这个包已经不建议使用了 附,dbms_random几个参数的介绍:
function value return
number,返回一个[0,1)之间的随机数,精度为38位(Gets a random number,
greater than or equal to 0 and less than 1, with decimal 38 digits)
function value(low IN NUMVBER,high IN NUMBER) return
number,返回一个[low,high)之间的随机数 function normal return
number,return random numbers in a standard normal
distribution,返回服从正态分布的一组数,标准偏差为1,期望值为0,返回值中68%介于+1
和 -1 之间,95%介于 +2 和 -2 之间,99%介于+3 和 -3之间。 function random
return BINARY_INTEGER, (Generate Random Numeric Values), function
string(opt char,length Number) return
varchar2,返回一个指定长度的字符串( Create Random Strings),opt seed
values: ‘a’,’A’&n
问:我工作中的问题:主管让我为了某个活动要随机取出一些符合条件的EMAIL或者手机号码用户,来颁发获奖通知或其它消息,我们公司用的Oracle
9i 请问这个如何实现? 答:可以用oracle里生成随机数的PL/SQL,
目录文件名在:/ORACLE_HOME/rdbms/admin/dbmsrand.sql。
用之前先要在sys用户下编译:
SQL>@/ORACLE_HOME/rdbms/admin/dbmsrand.sql
它实际是在sys用户下生成一个dbms_random程序包,同时生成公有同义词,并授权给所有数据库用户有执行的权限。
使用dbms_random程序包, 取出随机数据的方法: 1.
先创建一个唯一增长的序列号tmp_id create sequence tmp_id increment by 1
start with 1 maxvalue 9999999 nocycle nocache; 2.
然后创建一个临时表tmp_1,把符合本次活动条件的记录全部取出来。 create
table tmp_1 as select tmp_id.nextval as id,email,mobileno from 表名
where 条件; 找到最大的id号: select max from tmp_1; 假设为5000 3.
设定一个生成随机数的种子 execute dbms_random.seed; 或者 execute
dbms_random.seed(TO_CHAR(SYSDATE,’MM-DD-YYYY HH24:MI:SS’)); 4.
调用随机数生成函数dbms_random.value生成临时表tmp_2 假设随机取200个
create table tmp_2 as select trunc(dbms_random.value as id from tmp_1
where rownum<201; [
说明:dbms_random.value是取1到5000间的随机数,会有小数,
trunc函数对随机数字取整,才能和临时表的整数ID字段相对应。
注意:如果tmp_1记录比较多,也可以找一个约大于两百行的表来生成tmp_2
create table tmp_2 as select trunc(dbms_random.value as id from tmp_3
where rownum<201; ] 5. tmp_1和tmp_2相关联取得符合条件的200用户
select t1.mobileno,t1.email from tmp_1 t1,tmp_2 t2 where t1.id=t2.id;
[ 注意:如果tmp_1记录比较多,需要在id字段上建索引。]
也可以输出到文本文件: set pagesize 300; spool /tmp/200.txt; select
t1.mobileno,t1.email from tmp_1 t1,tmp_2 t2 where t1.id=t2.id order by
t1.mobileno; spool off; 6.
用完后,删除临时表tmp_1、tmp_2和序列号tmp_id。

Oracle数据库升级也并非简单的事,这篇文章对Oracle那点事做了较详细的介绍:Oracle数据库升级或数据迁移方法研究

废话不多说了,直接给大家贴代码了,具体代码如下所示:

正在看的ORACLE教程是:Oracle约束管理脚本。

简单得说,通过dbms_random包调用随机数的方法大致有4种:

我还属于Oracle的菜鸟,就不献丑介绍了。

#!/bin/sh#******************************************************************# File: oraclebak.sh# Creation Date: 2014/1/22 17:57:32# Last Modified: 2014/1/22 17:57:34# 脚本功能:oracle备份脚本# 执行方法:1、第一次执行需要root用户执行,脚本会以询问的方式创建备份目录和相关参数# 2、脚本会自动写入crontab调度里面定时执行,crontab设置是在第一次执行的时候自动添加的#******************************************************************echo $USERif [ $USER != root ]thenecho "检测到安装用户不是root用户,请用root用户登录再执行安装文件"exit 1fiecho "开始安装oracle数据库备份工具.........................."echo "请输入备份程序的安装目录:"read installdirmkdir -p $installdirresult=$?while [ $result -ne 0 ]doecho "无法创建目录,请重新输入或退出安装。输入y重新输入,输入n退出安装。"read redoif [ $redo != y ]thenecho "用户退出安装。"exit 0fiecho "请输入备份程序的安装目录:"read installdirmkdir $installdirresult=$?doneecho "安装目录创建完成。"echo "请输入执行备份用户:"read execuserid $execuserresult=$?while [ $result -ne 0 ]doecho "不存在该用户,是否更换其它用户或者退出安装新建用户,输入y更换用户,输入n退出安装"read redoif [ $redo != y ]thenecho "用户退出安装"exit 0fiecho "请输入执行备份的用户"read execuserid $execuserresult=$?doneecho "你希望建立备份的数据库数量"read backnumif [ $backnum -eq 0 ]thenecho "无备份数据库,退出安装"exit 0fiscount=0while [ $scount -lt $backnum ]doecho "请输入第"$"个备份登录登录oracle数据库的用户名和密码,以及本地服务名"echo "用户名"read username[$scount]echo "密码"read password[$scount]echo "服务名"read sname[$scount]su -l -c"sqlplus /nolog" $execuser<$installdir/runback.shecho "source ~/.bash_profile">>$installdir/runback.shecho "nowdate=\$(date +%Y-%m-%d_%k.%M.%S)">>$installdir/runback.shecho "nowmouth=\$">>$installdir/runback.shecho "echo \"\$nowdate开始备份.......................................\">>$installdir/logs/\$nowmouth.log">>$installdir/runback.shscount=0snum=${#username[@]}while [ $scount -lt $snum ]doecho "exp ${username[$scount]}/${password[$scount]}@${sname[$scount]} file=$installdir/temp/${username[$scount]}_${sname[$scount]}\$nowdate.dmp compress=N>>$installdir/logs/\$nowmouth.log 2>&1">>$installdir/runback.shscount=$doneecho "echo \"\$(date +%Y-%m-%d_%k.%M.%S)完成备份.......................................\">>$installdir/logs/\$nowmouth.log">>$installdir/runback.shecho "echo \"\$(date +%Y-%m-%d_%k.%M.%S)开始打包.......................................\">>$installdir/logs/\$nowmouth.log">>$installdir/runback.shecho "gzip $installdir/zip/\$nowdate.zip $installdir/temp/>>$installdir/logs/\$nowmouth.log 2>&1">>$installdir/runback.shecho "rm -Rvf $installdir/temp/*>>$installdir/logs/\$nowmouth.log 2>&1">>$installdir/runback.shecho "echo \"\$(date +%Y-%m-%d_%k.%M.%S)打包完成.......................................\">>$installdir/logs/\$nowmouth.log">>$installdir/runback.shscount=0if [ ${#rtype[@]} -ne 0 ]thenecho "echo \"\$(date +%Y-%m-%d_%k.%M.%S)进行远程备份.......................................\">>$installdir/logs/\$nowmouth.log">>$installdir/runback.shsnum=${#rtype[@]}while [ $scount -lt $snum ]doecho "lftp -u ${rname[$scount]},${rpass[$scount]} ${rtype[$scount]}://${rurl[$scount]}<>$installdir/runback.shecho "mkdir remotedbback">>$installdir/runback.shecho "cd remotedbback">>$installdir/runback.shecho "mput $installdir/zip/\$nowdate.zip">>$installdir/runback.shecho "exit">>$installdir/runback.shecho "remote">>$installdir/runback.shscount=$doneecho "echo \"\$(date +%Y-%m-%d_%k.%M.%S)完成远程备份.......................................\">>$installdir/logs/\$nowmouth.log">>$installdir/runback.shfiecho "exit 0">>$installdir/runback.shchmod 775 $installdir/runback.shchown $execuser $installdir/runback.shecho "生成备份执行文件完成............................"echo "开始定制值守时间................................"scount=0snum=${#backtime[@]}while [ $scount -lt $snum ]doecho "${backtime[$scount]} $installdir/runback.sh">>$installdir/planlistscount=$donesu -l -c"crontab $installdir/planlist" oracleecho "完成值守时间定制................................"exit 0

作为一个Oracle数据库管理员,会碰到这样的数据库管理需求,停止或者打开当前用户下所有表的约束条件和触发器。这在数据库的合并以及对数据库系统的代码表中某些代码的修改时需要做的工作之一。
我们来看这样一种实际数据库工作业务需求,这在目前的许多应用中是非常实际的。某地区银行数据,目前采用市级数据集中,随着计算机网络技术的不断提高以及对服务水平的要求,提出了省级乃至国家级的数据集中。除了应用需要修改以外,对于数据库管理员来讲,最重要的工作就是对各地分散管理的数据库统一集中到一个或者几个集中数据库中。此时就需要整理以前各地各自为政的代码表为一个统一的代码表以及数据库的最后集中合并。
对Oracle数据库管理员来讲,这样的数据维护工作,在更新代码表中代码或者合并数据之前,首先要作的工作就是将系统中某用户下所有的外键或触发器停止,处理完数据后,再打开这些关闭的外键和触发器。针对这样的工作需求,本文给出了下面两个SQL脚本:系统中某模式或用户下外键或者触发器的管理脚本;外键错误自动查找脚本。下面就来详细介绍这两个脚本。
一、约束管理脚本
该脚本可用来管理当前登录用户下的所有外键和触发器的打开和关闭,此处没有处理主键和唯一约束条件,该脚本稍加修改就可以处理主键和唯一约束条件,但这里建议最好不要在随意停止主键或唯一约束条件后,进行数据维护。
脚本运行方法如下:
其中,参数as_alter只能是“ENABLE”或者“DISABLE”,否则程序提示错误。当参数为“ENABLE”时,表示将当前模式下所有的外键和触发器打开,相反“DISABLE”就是将当前模式下所有的外键和触发器关闭。
附存储过程脚本:
判断输入参数是否为DISABLE或者是ENABLE,如果是的话,就继续处理,否则退出过程,给出提示
IF=’DISABLE’ORUPPERTHEN OPENC_CON;

1、dbms_random.normal

下面我就简单总结下,Oracle同版本升级的经历:升级数据库:1.
先检查数据库当前版本:SELECT * FROM v$version;

接下来给大家介绍linux oracle自动备份脚本

[NextPage] 当前用户下外键的处理ENABLE或者DISABLE
二、约束错误自动查找脚本
一般,数据库管理员在对数据进行维护时,如新数据的导入前,首先要关闭所有的外键和触发器,数据成功导入后,再打开导入前关闭的外键和触发器。这时经常会遇到错误号为ORA-02298的“未找到父项关键字”的错误。该错误的原因就是数据库表中出现了不能满足外键约束条件的记录。这里,另外给出了一个脚本用来自动查找造成这类错误的原因,也就是找出不满足外键约束条件的字段值。
该存储过程可单独运行,同时在前面介绍的存储过程P_ALTERCONS中也进行了调用,在存储过程P_ALTERCONS中,可以看到在打开外键时,如果出现错误号为ORA-02298的错误,就调用该存储过程,自动查找造成外键不能启动的原因。
下面是单独运行该存储过程的例子,在SQL/PLUS环境下:

这个函数不带参数,能返回normal
distribution的一个number类型,所以基本上随机数会在-1到1之间。
简单测试了一下,产生100000次最大能到5左右:

  1. 使用RMAN或exp
    进行全库备份【这一步非常非常重要,因升级到数据部分时,虚拟机没空间了,导致VM崩溃,升级失败.orcl库也挂了,不得不从另一台Oracle上创建了一个Orcl,然后,冷备迁移过来,才得以重新升级。】如:RMAN全备
    export ORACLE_SID=orcl rman target / RMAN>backup full database plus
    archivelog //全备数据库,并且包括ArchiveLog。

  2. 最后按下面步骤进行升级<1> 先知道Oracle 7个更新文件的作用:第一
    和 二个包表示database ,
    如果升级数据库,只需要这2个文件即可。第三个包表示grid, 用来升级RAC
    的CRS。如果升级RAC 要先用这个文件。第四个表示客户端,第五个表示gateways,
    第六个表示 examples, 这个是我们的示例文件安装包。

1、备份脚本:

PL/SQL过程已成功完成。
其中,FK_SB_HJJL_RELATION__SB_PZXH为出现错误的外键名称。
附存储过程脚本:

 declare i number:=; j number:=; begin for k in .. loop i:= dbms_random.normal; if i > j then j:=i; end if; end loop; dbms_output.put_line; end; 

<2>
升级Oracle数据库首先将第一和二个zip压缩包上传,并在同一个目录下解压,因为,它两的目录结构基本一致,并且这两压缩包的内容需要合并后才能,执行runInstaller文件。所有要在同一个目录下解压,这样会直接合并。

#!/bin/sh export ORACLE_BASE=/home/oracle export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1 export ORACLE_SID=orcl export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin export DATA_DIR=/home/bakup/data export LOGS_DIR=/home/bakup/logs export DELTIME=`date -d "7 days ago" +%Y%m%d` export BAKUPTIME=`date +%Y%m%d%H%M%S` mkdir -p $DATA_DIR mkdir -p $LOGS_DIR echo "Starting bakup..." echo "Bakup file path $DATA_DIR/$BAKUPTIME.dmp" exp shop/lyisABC0987@orcl file=$DATA_DIR/$BAKUPTIME.dmp log=$LOGS_DIR/$BAKUPTIME.log echo "Delete the file bakup before 7 days..." rm -rf $DATA_DIR/$DELTIME*.dmp rm -rf $LOGS_DIR/$DELTIME*.log echo "Delete the file bakup successfully. " echo "Bakup completed." 

5.15325081797418404136433867107468983182

<3>
运行runInstaller,若没有图像界面会可能就需要有应答文件了,这个就需要再查了,我测试时,有图形界面,所以直接用图形界面来升级:需要注意几个地方:A.
这是第一个地方,这里需要点,“Skip software
updates”跳到软件更新B.这里是选项安装新Oracle软件的位置,这里不能写旧的位置。另注:
磁盘空间一定要5~10G, Oracle11.2.0.1升级到11.2.0.3需要4.1G。C.
第三点:需要注意:
/etc/oratab这个文件。因为,更新到最后是更新数据库,更新数据库时,必须要有一个数据库是运行的.才能执行,并且更新数据库时,它是通过oratab文件来让你选择通过那个运行的数据库来尝试更新数据库。

2、添加到任务调度

PL/SQL procedure successfully completed

4.
数据库更新完后,需要做以下事情:首先,升级完成后,需要将Oracle必须的环境变量修改为升级后的Oracle软件路径。需要修改:
ORACLE_HOME.如我的环境:Oracle11.2.0.1时:ORACLE_BASE=/home/oracle/oraORACLE_HOME=$ORACLE_BASE/product/11g/db_1升级后,Oracle版本为:11.2.0.3,新的家目录为:Oracle11.2.0.3:
ORACLE_HOME=$ORACLE_BASE/product/11.2.0.3/db_1

crontab -u oracle -e* 3 * * *
/home/bakup/bakup.sh即每天凌晨3点进行备份如需每天备份多次,可设置不同时间段备份:例如:*
3,13,18 * * *
/home/bakup/bakup.sh,即每天3点、13点、18点进行备份。说明:文件备份目录,用户oracle必须有更改权限,否则无法备份。

2、dbms_random.random

<1> 先执行这个文件,用sysdba的权限:

这个也没有参数,返回一个从-power的整数值

 SQL> SPOOL update.info SQL> $ORACLE_HOME/rdbms/admin/utlu112i.sql SQL> SPOOL OFF

3、dbms_random.value

查看日志是否有错误。

这个函数分为两种,一种是没有参数,则直接返回>=0 and
<1之间的38位小数

<2> 关闭数据库,并更新启动。

 SQL > column value format 9.99999999999999999999999999999999999999 SQL > select dbms_random.value from dual; VALUE ----------------------------------------- .58983014999643548701631750396301271752
 SQL> shutdown immediate SQL> startup upgrade SQL> select * from v$version; #查看Oracle的版本。 SQL> select status from v$instance; STATUS ------------ OPEN MIGRATE #下面开始执行升级脚本。 SQL> SPOOL update-info.log SQL> @$ORACLE_HOME/rdbms/admin/catupgrd.sql #下面是查看升级结果的; 这个不是很确定,因为参考博客的环境是, # 是9i 升 10g #SQL> @$ORACLE_HOME/rdbms/admin/utlu102s.sql SQL> SPOOL OFF

第二种是加上两个参数a、b,则返回值在>=a and

完成后,需要查看升级日志,是否有保错,若有,则重新执行升级SQL脚本。

 SQL > column value format 999.999999999999999999999999999999999999 SQL > select dbms_random.value value from dual; VALUE ----------------------------------------- 412.150194612502916808701157054098274240
 #升级完成后,需要重启DB. SQL> shutdown immediate SQL> startup #下面是执行重新编译无效对象 SQL> @$ORACLE_HOME/rdbms/admin/utlrp.sql #查看是否还存在无效对象,若为0,则表示升级完成。否则重新执行编译。 SQL> SELECT count FROM dba_objects WHERE status='INVALID'; SQL> select name from v$database; #确认数据库的SID是否正确。 SQL> show user; #确认当前是否为sys用户。 SQL> select tablespace_name, bytes from dba_data_files; #确认表空间大小是否正确. #下面这个步骤网文中没有,这是尚观视频中提到的,作用不明. #SQL> @$ORACLE_HOME/rdbms/admin/catalog.sql #最后,重启数据库没有问题就是升级成功了。 SQL> select status from v$instance; STATUS ------------ OPEN #注意,成功打开数据库后,这里将是OPEN,而非OPEN MIGRATE

注意:无论前面几位,小数点之后都是38位

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

可以用trunc()函数取整

4、dbms_random.string

这个函数必须带有两个参数,前面的字符指定类型,后面的数值指定位数

 'u','U' : upper case alpha characters only 'l','L' : lower case alpha characters only 'a','A' : alpha characters only  'x','X' : any alpha-numeric characters  'p','P' : any printable characters SQL > column value format a30 SQL > select dbms_random.string value from dual; VALUE ------------------------------ VTQNLGISELPXEDBXKUZLXKBAJMUTIA SQL > select dbms_random.string value from dual; VALUE ------------------------------ uqygsbquingfqdytpgjvdoblxeglgu SQL > select dbms_random.string value from dual; VALUE ------------------------------ NGTGkQypuSWhBfcrHiOlQwOUXkqJjy SQL > select dbms_random.string value from dual; VALUE ------------------------------ UVWONYJMXT31VEFPD736WJCJ5QT6BD SQL > select dbms_random.string value from dual; VALUE ------------------------------ :mak$(WT4M_7c/+f[_XUscf$P Zcq{

5、关于seed

可以设置seed来确定随机数的起始点,对于相同的seed而言,随机数的任意一次变化都将是确定的。

就是说,如果在某一时刻调用了seed,之后第一次产生的随机数是4,第二次是6,第三次是1,那么当你再次调用相同的seed之后,一次产生的随机数还是4、6、1

seed有两种,一种是数值型的,一种是字符型的

 -- Seed with a binary integer PROCEDURE seed(val IN BINARY_INTEGER ); PRAGMA restrict_references ; -- Seed with a string  PROCEDURE seed; PRAGMA restrict_references ;

6、关于initialize

一个integer参数,注释说的很清楚了:

 -- Obsolete, just calls seed PROCEDURE initialize(val IN BINARY_INTEGER ); PRAGMA restrict_references ;

本文给大家介绍的ORACLE随机数DBMS_RANDOM包,就到此为止了,希望对大家学习oracle随机数有所帮助。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图