druid DBMS_RANDOM报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了druid DBMS_RANDOM报错相关的知识,希望对你有一定的参考价值。

参考技术A 原因如下:
1)使用了Oracle随机排序 order by dbms_random.value;
2)springboot集成druid连接池批量更新异常。
解决方法:
1)更改druid 配置并解决问题。
2)设置Druid的防火墙配置(WallConfig)中变量multiStatementAllow=true,新建DruidDataSource配置类。

oracle使用DBMS_RANDOM包生成随机数据

 

(一)DBMS_RANDOM包信息

DBMS_RANDOM包包含3个存储过程,4个函数,1个类型,一共8个模块,如下。

SQL> desc dbms_random
Element    Type      
---------- --------- 
VALUE      FUNCTION  
NORMAL     FUNCTION  
STRING     FUNCTION  
RANDOM     FUNCTION  
INITIALIZE PROCEDURE 
SEED       PROCEDURE
TERMINATE  PROCEDURE 
NUM_ARRAY  TYPE 

 

(二)各个模块的用法

(2.1)dbms_random.value ( function)

如果不输入任何参数,该函数默认返回一个0到1之间的随机数字。准确的说,该小数取值范围为[0,1),即包含0但是不包含1。在小数点右边有38位数字。

如果输入最小值和最大值,那么将会返回一个在最小值和最大值之间的数据。

语法:

DBMS_RANDOM.VALUE
    RETURN NUMBER;

--或是
DBMS_RANDOM.VALUE(
      low     IN    NUMBER                            
      high    IN    NUMBER)
    RETURN NUMBER;

例子:

--默认生成0到1之间的随机数
SQL> select dbms_random.value from dual;

     VALUE
----------
0.28510444


--输入上下限,生成10~20之间的随机数
SQL> select dbms_random.value(10,20) from dual;

DBMS_RANDOM.VALUE(10,20)
------------------------
        14.8069717352864

 

(2.2)dbms_random.normal(function)

 生成一个正态分布的随机数,关于正态分布,从网上查找资料,大致可以了解到,通过dbms_random.normal生成的数据,其分布范围为:

从-1到1之间的数据占68%,从-2到2之间的数据占95%,从-3到3之间的数据占99%

                                  图1.正态分布

 语法:

-- 注意,该function没有输入参数
DBMS_RAMDOM.NORMAL
    RETURN NUMBER;

例子:

SQL> select dbms_random.normal from dual;

    NORMAL
----------
0.35939267

 

(2.3)dbms_random.string(function)

 该函数生成一个随机字符串。

语法:

DBMS_RANDOM.STRING(
     opt        IN    CHAR,
     len        IN    NUMBER)
  RETURN VARCHAR2;

 该函数需要传入2个参数,opt

Parameter Description
opt

用来定义返回的字符串的样式:

  • \'u\', \'U\' --返回大写字母的字符串
  • \'l\', \'L\' --返回小写字母的字符串
  • \'a\', \'A\' --返回大小写混合的字符串
  • \'x\', \'X\' -- 返回大写字母与数字结合的字符串
  • \'p\', \'P\' --返回任何可打印的字符串

否则返回大写字母字符串。

len 返回字符串的长度

 

 

 

 

 

 

 

 

 

 

例子:

--返回大写字母组成的字符串
SQL> select dbms_random.string(\'u\',10) from dual;
DBMS_RANDOM.STRING(\'U\',10)
------------------------------------
RLYKTDIRGI

--返回小写字母组成的字符串
SQL> select dbms_random.string(\'l\',10) from dual;
DBMS_RANDOM.STRING(\'L\',10)
-------------------------------------
auyuhusjfe

--返回大小写混合的字符串
SQL> select dbms_random.string(\'a\',10) from dual;
DBMS_RANDOM.STRING(\'A\',10)
-------------------------------------
OyNQIrlzVW

--返回大写字母+数字混合的字符串
SQL> select dbms_random.string(\'x\',10) from dual;
DBMS_RANDOM.STRING(\'X\',10)
-----------------------------------------
XEXVNQ7Y5R

--返回任意可以打印的字符串
SQL> select dbms_random.string(\'p\',10) from dual;
DBMS_RANDOM.STRING(\'P\',10)
--------------------------------------
.ZPb-V.i.-

--如果指定的不是上面的参数,则返回大写字母组成的字符串
SQL> select dbms_random.string(\'s\',10) from dual;
DBMS_RANDOM.STRING(\'S\',10)
------------------------------------
POLCDVHRKE

 

(2.4)dbms_random.random(function)

返回一个大于或等于-power(2,31)到小于或等于power(2,31)的随机数。不过Oracle不建议使用该函数,因为在11gR1中废弃了。

“Note:This procedure is deprecated with Release 11gR1 and, although currently supported, it should not be used.”

语法:

DBMS_RANDOM.RANDOM
    RETURN binary_integer;

 例子

SQL> select dbms_random.random from dual;

    RANDOM
----------
 325418642

 

(2.5)dbms_random.initialize(procedure)

该存储过程用于初始化生成器。与ramdom一样,Oracle不建议使用该函数,因为在11gR1中废弃了。

该存储过程已经过时,因为它只是简单的调用seed存储过程(原文:This procedure is obsolete as it simply calls the SEED Procedures.)

语法:

DBMS_RANDOM.INITIALIZE(
    val    IN       BINARY_INTEGER);

 

 (2.6)dbms_random.seed(procedure)

该存储过程用于设定种子。在设定种子之后,可以确保每次执行输出的结果相同。

语法:

DBMS_RANDOM.SEED (
     val     IN    BINARY_INTEGER);

--或者
DBMS_RANDOM.SEED (
    val      IN    VARCHAR2);

 

例子:

--未设定seed,2次执行同一个pl/sql块,结果不同

--第1次执行 SQL> begin 2 for i in 1..5 loop 3 dbms_output.put_line(dbms_random.value(1,10)); 4 end loop; 5 end; 6 / 7.59767929575396153812259452034656438431 6.97539265222375730852839307412202430431 7.33806531652342308613878338447091428107 4.89245334013733738508437786557633898074 1.38879870308996313960638201385754773661 PL/SQL procedure successfully completed --第2次执行 SQL> begin 2 for i in 1..5 loop 3 dbms_output.put_line(dbms_random.value(1,10)); 4 end loop; 5 end; 6 / 8.1683965227100007068358716650335800015 5.43375383239697580591581003445848864422 4.69519556951657412911331859048606134568 1.98874282533230976261862622335817894101 6.57191642048605638448861960830764815336 PL/SQL procedure successfully completed
--设定seed,2次执行同一个pl/sql块,结果相同

--第1次执行
SQL> begin 2 dbms_random.seed(\'jiaman\'); 3 for i in 1..5 loop 4 dbms_output.put_line(dbms_random.value(1,10)); 5 end loop; 6 end; 7 / 7.88871486248578462461220968538206416509 9.9339215654944111380218579659105820674 9.26587220376346888918600380784743125956 9.9630882208005389088257850931854514369 3.35183691734731293112104762732782208283 PL/SQL procedure successfully completed
--第2次执行 SQL
> begin 2 dbms_random.seed(\'jiaman\'); 3 for i in 1..5 loop 4 dbms_output.put_line(dbms_random.value(1,10)); 5 end loop; 6 end; 7 / 7.88871486248578462461220968538206416509 9.9339215654944111380218579659105820674 9.26587220376346888918600380784743125956 9.9630882208005389088257850931854514369 3.35183691734731293112104762732782208283 PL/SQL procedure successfully completed

 

 (2.7)dbms_random.terminate(procedure)

当用完dbms_random包后,调用terminate存储过程。11gR1 版本不推荐使用此过程, 虽然当前支持, 但不应使用此过程。

语法:

dDBMS_RANDOM.TERMINATE;

 

(2.8)dbms_random.num_array(type)

 


 

参考文档:https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_random.htm#ARPLS67506

 

以上是关于druid DBMS_RANDOM报错的主要内容,如果未能解决你的问题,请参考以下文章

Apollo报错

React 引用报错

又报错了

R语言arules报错

vm17报错

Quartus II 6.0的报错!