以Oracle为例的快逸报表连接数据库时的随机数产生函数
快逸报表用户有的时候需要快逸报表连接数据库的时候产品随机函数,其实这个需求可以直接在SQL中进行操作实现。具体的操作是:
–我们先从数字开始。VALUE函数会返回一个大于等于0但是小于1的数,精度是38位。
SELECT DBMS_RANDOM.VALUE FROM DUAL;
–对于指定范围内的整数,要加入参数low_value和high_value,
–并从结果中截取小数(最大值不能被作为可能的值)
SELECT TRUNC(DBMS_RANDOM.VALUE(0, 100)) FROM DUAL;
–要随机生成文本字符串,就要使用STRING函数并编写代码指定字符串的类型和所希望的长度:
–‘U’用来生成大写字符,‘L’用来生成小写字符,‘A’用来生成大小写混合的字符。
SELECT DBMS_RANDOM.STRING(‘A’, 10) FROM DUAL;
SELECT DBMS_RANDOM.STRING(‘U’, 10) FROM DUAL;
SELECT DBMS_RANDOM.STRING(‘L’, 10) FROM DUAL;
CREATE SEQUENCE TEXT_SEQ
MINVALUE 1
MAXVALUE 99999
START WITH 1
INCREMENT BY 1
CACHE 20
CREATE TABLE TEXT(
ID NUMBER (20),
NAME VARCHAR2(30)
);
INSERT INTO TEXT(ID,NAME) VALUES(TEXT_SEQ.NEXTVAL,’AAA’);
INSERT INTO TEXT(ID,NAME) VALUES(TEXT_SEQ.NEXTVAL,’BBB’);
INSERT INTO TEXT(ID,NAME) VALUES(TEXT_SEQ.NEXTVAL,’CCC’);
INSERT INTO TEXT(ID,NAME) VALUES(TEXT_SEQ.NEXTVAL,’DDD’);
INSERT INTO TEXT(ID,NAME) VALUES(TEXT_SEQ.NEXTVAL,’EEE’);
INSERT INTO TEXT(ID,NAME) VALUES(TEXT_SEQ.NEXTVAL,’FFF’);
INSERT INTO TEXT(ID,NAME) VALUES(TEXT_SEQ.NEXTVAL,’GGG’);
INSERT INTO TEXT(ID,NAME) VALUES(TEXT_SEQ.NEXTVAL,’HHH’);
INSERT INTO TEXT(ID,NAME) VALUES(TEXT_SEQ.NEXTVAL,’III’);
INSERT INTO TEXT(ID,NAME) VALUES(TEXT_SEQ.NEXTVAL,’JJJ’);
INSERT INTO TEXT(ID,NAME) VALUES(TEXT_SEQ.NEXTVAL,’KKK’);
INSERT INTO TEXT(ID,NAME) VALUES(TEXT_SEQ.NEXTVAL,’LLL’);
SELECT *FROM TEXT;
–随机产生表里的数据
select *from text order by dbms_random.value;
–随机取出几条数据
select *from (select *from text order by dbms_random.value) where rownum<=5
–另一种方法随机取出数据 无法控制取出多少条,但效率非常高,适合数据量大的时候
select * from (select * from text sample(50)) where rownum <=10;
–使用TO_CHAR函数和‘J’格式代码,你可以为今天的日期生成一个内部日期数:
SELECT TO_CHAR(SYSDATE, ‘J’) FROM DUAL
–例如,要生成一个2007年内的任意日期,你可以首先确定2007年1月1日的日期整数;
SELECT TO_CHAR(TO_DATE(’01/01/07′,’mm/dd/yy’),’J')FROM DUAL;
–系统给的结果是2454102。所以要生成该年度内的任意日期,
–我们就要用带有low_value等于2454102和high_value等于2454102+364
–参数的DBMS_RANDOM.VALUE,再把它转换成日期:
SELECT TO_DATE(TRUNC(DBMS_RANDOM.VALUE(2454102,2454102+364)),’J')FROM DUAL;
–在过去30分钟内取随机时间
SELECT (SYSDATE – 1 / 24 / 60 * 30) +
DBMS_RANDOM.VALUE (1, 1800) / 3600 / 24
FROM DUAL;
– 在过去10天内取随机日期
SELECT TO_DATE (
TRUNC (
DBMS_RANDOM.VALUE
(TO_NUMBER (TO_CHAR (SYSDATE – 10,’J')),TO_NUMBER
(TO_CHAR (SYSDATE, ‘J’)))),’J’
)
FROM DUAL;