Oracle PL/SQL Programming 第9章:Numbers 读书笔记

news2024/11/20 0:33:20

总的目录和进度,请参见开始读 Oracle PL/SQL Programming 第6版

本章谈3点:

  1. 可使用的数字数据类型
  2. 如何在数字和文本间转换
  3. PL/SQL 内置数值函数

Numeric Datatypes

  • NUMBER:平台无关的实现,适合处理货币金额
  • PLS_INTEGER 和 BINARY_INTEGER:硬件机器指令执行,数据库中无法存储
  • SIMPLE_INTEGER:同BINARY_INTEGER,除了不能存NULL,以及溢出时不会引发异常
  • BINARY_FLOAT 和 BINARY_DOUBLE:单精度和双精度浮点,不适合存金额,但运算速度快
  • SIMPLE_FLOAT 和 SIMPLE_DOUBLE:与 BINARY_FLOAT 和 BINARY_DOUBLE 具有相同的范围,但不允许 NULL,发生溢出则不引发异常

其他如 FLOAT, INTEGER, 和 DECIMAL只是别名而已。

The NUMBER Type

最常用,可以存整数、定点数和浮点数,平台无关的实现,也就是在任何平台计算结果都一样。

number(p, s) /* 定点数 */
number(p, 0) /* 整数 */
number /* 浮点数 */

文档中的描述为:

Number having precision p and scale s. The precision p can range from 1 to 38. The scale s can range from -84 to 127. Both precision and scale are in decimal digits. A NUMBER value requires from 1 to 22 bytes.

精度(p)是数字中有效数字的总数。 标度或小数位数(s)决定了小数点右侧(正数位数)或左侧(负数位数)的位数,并且还会影响舍入发生的点。 精度和标度都必须是字面整数值; 不能在声明中使用变量或常量。

标度通常小于精度,例如NUMBER(5, 2)的数字可能是999.99。

标度大于精度时,例如NUMBER(5, 7)。则形式为.0099999
5表示有5个有效数字(significant digits),从右往左数7,则确定了小数点位置。

以下代码是正确的:

set serveroutput on
declare
    a number(5,7) := 0.0099999;
begin
    DBMS_OUTPUT.PUT_LINE(a);
end;
/

但如果将0.0099999改为0.0999999或0.099999。则会报错:

Error report -
ORA-06502: PL/SQL: numeric or value error: number precision too large
ORA-06512: at line 2
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    An arithmetic, numeric, string, conversion, or constraint error
           occurred. For example, this error occurs if an attempt is made to
           assign the value NULL to a variable declared NOT NULL, or if an
           attempt is made to assign an integer larger than 99 to a variable
           declared NUMBER(2).
*Action:   Change the data, how it is manipulated, or how it is declared so
           that values do not violate constraints.

标度为负数时,则小数点是从最右边的有效数字再往右数。

例如NUMBER(5, -3),则形式为99999000.,但赋值199999000则报与以上相同的错。

标度是可选地,默认值为0。

精度和标度与正负无关。例如NUMBER(3, 0)可表示-999到999。

The PLS_INTEGER Type

这是PL/SQL数据类型,不算数据库内置数据类型。范围-2,147,483,648 到2,147,483,647。

值使用硬件平台的本机整数格式表示,所以运算速度快。

当您使用 PLS_INTEGER 进行整数算术(以及循环计数器)时,如果可以避免与 NUMBER 类型之间的多次转换,您将获得最大的效率。 当此数据类型用于整数算术时,结果值将四舍五入为整数。例如50/100等于1,49/100则等于0。

The BINARY_INTEGER Type

等同于PLS_INTEGER,不建议使用,因和版本相关。

The SIMPLE_INTEGER Type

是PLS_INTEGER的子类型,有NOT NULL约束,并且在溢出语义上与PLS_INTEGER不同。理论上,如果可以保证没有NULL或溢出,则此类型会快于PLS_INTEGER。

看一下原文的例子,其比较了PLS_INTEGER和SIMPLE_INTEGER的运算速度:

/* File on web: simple_integer_demo.sql */
-- First create a compute-intensive procedure using PLS_INTEGER
CREATE OR REPLACE PROCEDURE pls_test (iterations IN PLS_INTEGER)
AS
   int1      PLS_INTEGER := 1;
   int2      PLS_INTEGER := 2;
   begints   timestamp;
   endts     timestamp;
BEGIN
   begints := SYSTIMESTAMP;

   FOR cnt IN 1 .. iterations
   LOOP
      int1 := 0; /* 这句是我加的,否则会溢出 */
      int1 := int1 + int2 * cnt;
   END LOOP;

   endts := SYSTIMESTAMP;
   DBMS_OUTPUT.put_line(   iterations
                        || ' iterations had run time of:'
                        || TO_CHAR (endts - begints));
END;
/

CREATE OR REPLACE PROCEDURE simple_test (iterations IN SIMPLE_INTEGER)
AS
   int1      SIMPLE_INTEGER := 1;
   int2      SIMPLE_INTEGER := 2;
   begints   timestamp;
   endts     timestamp;
BEGIN
   begints := SYSTIMESTAMP;

   FOR cnt IN 1 .. iterations
   LOOP
      int1 := 0; /* 这句是我加的,否则会溢出 */
      int1 := int1 + int2 * cnt;
   END LOOP;

   endts := SYSTIMESTAMP;
   DBMS_OUTPUT.put_line(   iterations
                        || ' iterations had run time of:'
                        || TO_CHAR (endts - begints));
END;
/

测试如下:

BEGIN pls_test(123456789); END;
/
BEGIN simple_test(123456789); END;
/

从以上例子中可以学习如何计算运算时间。

另外PL/SQL有两种编译模式,INTERPRETED 和 NATIVE,默认为前者。

第二次运行时,使用NATIVE模式。

ALTER PROCEDURE pls_test COMPILE PLSQL_CODE_TYPE=INTERPRETED;
/

ALTER PROCEDURE simple_test COMPILE PLSQL_CODE_TYPE=INTERPRETED
/

两次的运行结果(Windows宿主机上的Linux虚机):

-- INTERPRETED 模式
123456789 iterations had run time of:+000000000 00:00:01.971535000
12345678 iterations had run time of:+000000000 00:00:00.397607000

-- NATIVE 模式
123456789 iterations had run time of:+000000000 00:00:00.777152000
12345678 iterations had run time of:+000000000 00:00:00.113956000

结论为:

  • NATIVE模式比INTERPRETED块
  • SIMPLE_INTEGER比PLS_INTEGER快

The BINARY_FLOAT and BINARY_DOUBLE Types

遵从IEEE-754浮点数标准,数据库表定义和PL/SQL均支持。可以加后缀f或d表示。如:

0.9f
0.9d

使用 IEEE-754 浮点类型时还可以使用一些特殊文字。

PL/SQL 和 SQL 都支持的:

  • BINARY_FLOAT_NAN、BINARY_DOUBLE_NAN表示“不是数字”。
  • BINARY_FLOAT_INFINITY、BINARY_DOUBLE_INFINITY表示无穷大。

仅 PL/SQL 支持的:

  • BINARY_FLOAT_MIN_NORMAL、BINARY_FLOAT_MAX_NORMAL定义您应该计划存储在变量中的值的正常范围。
  • BINARY_FLOAT_MIN_SUBNORMAL、BINARY_FLOAT_MAX_SUBNORMAL
    定义所谓的次正常值范围。 次正常值是 IEEE-754 标准的一部分,旨在将下溢引起的问题减少到零。

与数据类型一起使用的谓词:

  • IS NAN, IS NOT NAN 确定值是否为数字。
  • IS INFINITE, IS NOT INFINITE 确定值是否表示无穷大。

特别注意,BINARY类型是二进制表示的,因此其不精确,不适合存放和钱相关的值。涉及到钱的,用NUMBER
例如:

BEGIN
    DBMS_OUTPUT.PUT_LINE(0.95f); -- BINARY_FLOAT
    DBMS_OUTPUT.PUT_LINE(0.95d); -- BINARY_DOUBLE
    DBMS_OUTPUT.PUT_LINE(0.95);  -- NUMBER
 END;

输出为:

9.49999988E-001
9.4999999999999996E-001
.95

此类型用于比较时,要特别注意。
例如0.95f和0.95d是不相等的,0.95d精度要高些。

而以下则是相等的:

declare
   a number := 0.95f - 0.95d;
BEGIN
   IF ABS(a) < 0.000001d
   THEN
      DBMS_OUTPUT.PUT_LINE('TRUE');
   ELSE
      DBMS_OUTPUT.PUT_LINE('FALSE');
   END IF;
END;

原文没有定义变量a,而是将0.95f - 0.95d作为ABS的参数,但总是报错,不知为何:

Error report -
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 2
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    An arithmetic, numeric, string, conversion, or constraint error
           occurred. For example, this error occurs if an attempt is made to
           assign the value NULL to a variable declared NOT NULL, or if an
           attempt is made to assign an integer larger than 99 to a variable
           declared NUMBER(2).
*Action:   Change the data, how it is manipulated, or how it is declared so
           that values do not violate constraints.

使用这些IEEE-754类型,原因可能是为要符合IEEE-754标准(不符合的部分请查看Oracle SQL参考手册),或为了运算速度。

看一下原文中测试的主体:

...
   -- Compute area 5,000,000 times using binary doubles
   bd_begin := SYSTIMESTAMP;
   bd := 1d;
   LOOP
      bd_area := bd * bd * pi_bd;
      bd := bd + 1d;
      EXIT WHEN bd > 5000000;
   END LOOP;
   bd_end := SYSTIMESTAMP;
...

我的结果为:

-- 算圆的面积,500万次
BINARY_DOUBLE area = +00 00:00:00.298879000
NUMBER        area = +00 00:00:01.094699000
-- 算Sin函数,500万次
BINARY_DOUBLE sine = +00 00:00:00.738123000
NUMBER        sine = +00 00:00:58.136234000

数据类型优先级
详见Data Type Precedence。

Oracle 使用数据类型优先级来确定隐式数据类型转换,Oracle 数据类型具有以下优先级(由高到低):

  • Datetime 和interval数据类型
  • BINARY_DOUBLE
  • BINARY_FLOAT
  • NUMBER
  • Character 数据类型
  • 所有其他内置数据类型

如果使用隐式转换,0.95f+0.95d的类型是BINARY_DOUBLE。

如果不想隐式转换,则可以用TO_NUMBER, TO_BINARY_FLOAT或 TO_BINARY_DOUBLE.显式转换,诸如此类。

总之,Oracle不建议隐式转换

Oracle recommends that you specify explicit conversions, rather than rely on implicit or automatic conversions

因为:

  • 使用显式数据类型转换函数时,SQL 语句更容易理解。
  • 隐式数据类型转换可能会对性能产生负面影响。
  • 隐式转换的结果取决于它发生的上下文。 例如,从datetime 到 VARCHAR2 值的隐式转换可能会返回意外的年份,具体取决于 NLS_DATE_FORMAT 设置。
  • 隐式转换的算法可能会因软件版本和 Oracle 产品而异。 显式转换的行为更可预测。
  • 如果索引表达式中发生隐式数据类型转换,则 Oracle 数据库可能不会使用该索引,因为它是为转换前的数据类型定义的。 这可能会对性能产生负面影响。

详见这里

The SIMPLE_FLOAT and SIMPLE_DOUBLE Types

BINARY_FLOAT 和 BINARY_DOUBLE 数据类型的性能增强版,但不支持 NULL 值、特殊 IEEE 文字(BINARY_FLOAT_NAN、BINARY_DOUBLE_INFINITY 等)或特殊 IEEE 谓词(IS NAN、IS INFINITY 等)。 他们也不检查溢出情况。

Numeric Subtypes

大多是基础类型的别名,为了支持ISO SQL, SQL/DS和 DB2 数据类型。例如INT,SMALLINT等。

NATURAL 和 POSITIVE 都是 PLS_INTEGER 的子类型。 这些子类型限制了可以存储在变量中的值,它们的使用可以使程序自我说明。

数字转换

Number Conversions

使用TO_CHAR 和 TO_NUMBER进行转换。

The TO_NUMBER Function

说明见这里。

调用格式为:

TO_NUMBER(string [,format [,nls_params]])

通常只需要指定第一个参数,例如:

  • 字符串仅使用数字和一个小数点表示。
  • 前导符合必须是减号 (–) 或加号 (+)。 如果不存在,则假定该数字为正数。
  • 使用科学记数法
Using TO_NUMBER with a format model

格式详见这里。

例如:

select to_number('$1234', '$9999') from dual;
select to_number('12,34', '99,99') from dual;
Passing NLS settings to TO_NUMBER

数字格式模型元素最终都从 NLS 参数之一得出其含义。具体可查看设置:

SELECT * FROM nls_session_parameters;

PARAMETER                      VALUE                                                           
------------------------------ -------------------------------------
NLS_LANGUAGE                   AMERICAN                                                        
NLS_TERRITORY                  AMERICA                                                         
NLS_CURRENCY                   $                                                               
NLS_ISO_CURRENCY               AMERICA                                                         
NLS_NUMERIC_CHARACTERS         .,                                                              
NLS_CALENDAR                   GREGORIAN                                                       
NLS_DATE_FORMAT                DD-MON-RR                                                       
NLS_DATE_LANGUAGE              AMERICAN                                                        
NLS_SORT                       BINARY                                                          
NLS_TIME_FORMAT                HH.MI.SSXFF AM                                                  
NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM                                        
NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR                                              
NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR                                    
NLS_DUAL_CURRENCY              $                                                               
NLS_COMP                       BINARY                                                          
NLS_LENGTH_SEMANTICS           BYTE                                                            
NLS_NCHAR_CONV_EXCP            FALSE                                                           

17 rows selected. 

其中只能指定NLS_NUMERIC_CHARACTERS, NLS_CURRENCY 和 NLS_ISO_CURRENCY。例如:

select TO_NUMBER('F123.456,78','L999G999D99',
                 'NLS_NUMERIC_CHARACTERS='',.'''
                 || ' NLS_CURRENCY=''F'''
                 || ' NLS_ISO_CURRENCY=FRANCE') as result from dual;
    RESULT
----------
 123456.78

说明:

  • NLS_NUMERIC_CHARACTERS控制G,即组分隔符
  • NLS_CURRENCY控制L,即本地货币符号
  • NLS_ISO_CURRENCY控制D,即小数字符

这些最好通过会话设置来控制,而不是像上面例子,硬编码到代码中。

The TO_CHAR Function

是TO_NUMBER的逆函数。调用格式类似:

TO_CHAR(number [,format [,nls_params]])
Using TO_CHAR with no format

较少使用,一般都需要格式化使其更具可读性。

Using TO_CHAR with a format model
select TO_CHAR(123456789.01,'L999G999G999D99') from dual;

TO_CHAR(123456789.01,'L99
-------------------------
          $123,456,789.01

The V format element
V 格式元素比较特殊,允许您缩放值。

以股市为例,股票的标准交易单位是 100 股。因此,销售数字 123 实际上代表 123 个 100 股,即 12,300 股。
例如:

select TO_CHAR(123.45,'999V99') from dual;
TO_CHA
------
 12345

select TO_CHAR(123.45,'999V9999') from dual;
TO_CHAR(
--------
 1234500

Rounding when converting numbers to character strings
将字符串转换为数字时,只要小数点左侧或右侧的数字多于格式模型允许的数字,您就会收到错误。 但是,将数字转换为字符时,仅当数字需要的小数点左侧位数多于格式模型允许的位数时,您才会收到错误。 如果您在格式模型中指定的小数位数(即小数点右侧的位数)少于数字所需的数字,则该数字将被四舍五入,以便小数部分适合您的模型。

例如:

-- 错误
select TO_CHAR(123.4567,'99.99') from dual;
TO_CHA
------
######

-- 舍入
select TO_CHAR(123.4567,'999.99') from dual;
TO_CHAR
-------
 123.46

select TO_NUMBER('123.45', '999.9') from dual;
ORA-01722: invalid number
01722. 00000 -  "invalid number"
*Cause:    The specified number was invalid.
*Action:   Specify a valid number.

select TO_NUMBER('123.45', '99.99') from dual;
Error report -
SQL Error: ORA-01722: invalid number
01722. 00000 -  "invalid number"
*Cause:    The specified number was invalid.
*Action:   Specify a valid number.

Dealing with spaces when converting numbers to character strings

注意以下输出的区别:

select TO_CHAR(-123.4), LENGTH(TO_CHAR(-123.4)) from dual;
select TO_CHAR(123.4), LENGTH(TO_CHAR(123.4)) from dual;

select TO_CHAR(-123.4, '999.9'), LENGTH(TO_CHAR(-123.4, '999.9')) from dual;
select TO_CHAR(123.4, '999.9'), LENGTH(TO_CHAR(123.4, '999.9')) from dual;

TO_CHA LENGTH(TO_CHAR(-123.4))
------ -----------------------
-123.4                       6


TO_CH LENGTH(TO_CHAR(123.4))
----- ----------------------
123.4                      5


TO_CHA LENGTH(TO_CHAR(-123.4,'999.9'))
------ -------------------------------
-123.4                               6


TO_CHA LENGTH(TO_CHAR(123.4,'999.9'))
------ ------------------------------
 123.4                              6

注意最后2个SQL,当指定了格式模型时,TO_CHAR 总是为正负号留出空间。

如果你不需要前导空格,可以指定其他的格式模型,如TM,或使用LTRIM函数。

Passing NLS settings to TO_CHAR
和TO_NUMBER一样,也是只能指定NLS_NUMERIC_CHARACTERS, NLS_CURRENCY 和 NLS_ISO_CURRENCY。

The CAST Function

CAST 函数用于将数字转换为字符串,或反之。

手册见这里。

调用格式为:

CAST (expression AS datatype)

例如:

select cast(999.99 as varchar2(12)) from dual;
select cast('999.99' as number) from dual;

在SQL中写成如下会报错:

select cast(999.99 as varchar2) from dual;

但PL/SQL中不会:

DECLARE
   a NUMBER := -123.45;
   a1 VARCHAR2(30);
BEGIN
   a1 := CAST (a AS VARCHAR2);
END;

CAST 的缺点是不支持使用数字格式模型。 CAST 的优点是它是 ISO SQL 标准的一部分,而 TO_CHAR 和 TO_NUMBER 函数则不是。 如果编写 100% 符合 ANSI 的代码对您很重要,那么应该用CAST。
不过,PL/SQL本身就不是 ISO 标准的一部分,因此根据定义不可能编写 100% 符合 ISO 的 PL/SQL 代码。

Implicit Conversions

如果你想控制代码的行为,知道转换何时发生,最好使用显式转换。

总之,不要使用隐式转换,坏处前面都说过了。

例如:

-- 不好
select '123.400' || 999 from dual;

-- 好
select to_number('123.400' || to_char(999)) from dual;

作者也给出了一个例子,就是前面了个性能比较的例子:

DECLARE
   bd BINARY_DOUBLE;
  ...
BEGIN
   ...
   FOR bd IN 1..1000000 LOOP

     bd_area := bd**2 * pi_bd;
  END LOOP;
  ...

其中有两个问题:

  • FOR循环中的bd,实际上是隐式新声明了一个变量,他的类型是PLS_INTEGER。从而导致FOR循环体中使用PLS_INTEGER进行运算
  • bd**2,由于2原因,是结果隐式转换为NUMBER。此处2应写成2d。

Numeric Operators

注意:PL/SQL和SQL的运算符优先级(Operator Precedence)是不一样的。前者参考这里,后者参考这里。

以下是PL/SQL的,优先级从高到低,高优先级的先算:
在这里插入图片描述
例如:

DECLARE
  a INTEGER := 1+2**2;
  b INTEGER := (1+2)**2;
BEGIN
  DBMS_OUTPUT.PUT_LINE('a = ' || TO_CHAR(a));
  DBMS_OUTPUT.PUT_LINE('b = ' || TO_CHAR(b));
END;
/

Numeric Functions

前面介绍过TO_CHAR, TO_NUMBER。

Rounding and Truncation Functions

函数概述
CEILCEIL 返回大于或等于 n 的最小整数
FLOOR返回等于或小于 n 的最大整数
ROUNDROUND 返回 n 四舍五入到小数点右侧的整数位
TRUNC返回 n1 截断至 n2 位小数。 如果省略 n2,则 n1 被截断为 0 位。 n2 可以为负数,以截断小数点左侧的 n2 位(使其为零)

TRUNC函数将数字截断至指定的小数位数。 TRUNC 简单地丢弃超出调用中提供的小数位数的所有值。

作者设计这个练习挺好的:

1.751.355.5655.5610
小数位数001-12
ROUND2155.66010
TRUNC1155.55010
FLOOR11555510
CEIL22565610

Trigonometric Functions

PL/SQL 中提供了许多三角函数。 使用它们时,请注意所有角度均以弧度表示,而不是度数。你可以进行转换:

radians = pi * degrees / 180 -- 从度数到弧度
degrees = radians * 180 / pi -- 从弧度到度数

PL/SQL 本身没有实现 π (pi) 函数。 但是,您可以通过以下调用获取 π 的值:

select ACOS(-1) from dual;
  ACOS(-1)
----------
3.14159265

Numeric Function Quick Reference

下面的列表简要描述了 PL/SQL 的每个内置数值函数。 在适用的情况下,函数会针对不同的数字类型进行重载。

ABS:对于 BINARY_DOUBLE、BINARY_FLOAT、NUMBER、SIMPLE_INTEGER、SIMPLE_FLOAT、SIMPLE_DOUBLE 和 PLS_INTEGER 进行重载,因为您可以获取浮点值和整数值的绝对值

BITAND:对于 PLS_INTEGER 和 INTEGER(NUMBER 的子类型)重载,因为该函数被设计为仅对整数值进行 AND 运算

CEIL:对于 BINARY_DOUBLE、BINARY_FLOAT 和 NUMBER 重载,因为 CEIL 是一个并不真正适用于整数的函数

查看重载可以:

DESCRIBE SYS.STANDARD

...

列表详见这里:

  • ABS
  • ACOS
  • ASIN
  • ATAN
  • ATAN2
  • BIN_TO_NUM
  • BITAND
  • CEIL
  • COS
  • COSH
  • EXP
  • FLOOR
  • GREATEST
  • LEAST
  • LN
  • LOG
  • MOD
  • NANVL
  • POWER
  • REMAINDER
  • ROUND
  • SIGN
  • SIN
  • SINH
  • SQRT
  • TAN
  • TANH
  • TRUNC (number)
  • WIDTH_BUCKET
-- BIN_TO_NUM 将位向量转换为其等效数字
SELECT BIN_TO_NUM(1,0,1,0) FROM DUAL; 

BIN_TO_NUM(1,0,1,0)
-------------------
                 10
                 
-- BITAND将其输入和输出视为位向量; 输出是输入的按位与。
-- 0110 & 0011 = 0010 
SELECT BITAND(6,3) FROM DUAL;

BITAND(6,3)
-----------
          2

-- GREATEST 返回一个或多个表达式列表中最大的一个
-- LEAST 返回一个或多个表达式列表中的最小值。
SELECT GREATEST (1, '3.925', '2.4') "Greatest"
  FROM DUAL;

Greatest
--------
   3.925

SELECT LEAST (1, '3.925', '2.4') "Least"
  FROM DUAL;

     Least
----------
         1

-- REMAINDER 返回 n2 除以 n1 的余数。
SELECT remainder(10, 2.4) FROM DUAL;

REMAINDER(10,2.4)
-----------------
               .4

-- SIGN 返回 n 的符号。表示正,负或0
SELECT sign(3-10) FROM DUAL;

SIGN(3-10)
----------
        -1

-- 

WIDTH_BUCKET 允许您构建等宽直方图,其中直方图范围分为具有相同大小的间隔。 (将此函数与 NTILE 进行比较,NTILE 创建等高直方图。)理想情况下,每个桶都是实数轴的闭开区间。 例如,可以将一个桶分配给 10.00 到 19.999 之间的分数…以指示该区间中包含 10,并且排除 20。 有时这被表示为 [10, 20)。

对于给定的表达式,WIDTH_BUCKET 返回该表达式的值在计算后将落入的桶号。

SELECT customer_id, cust_last_name, credit_limit, 
   WIDTH_BUCKET(credit_limit, 100, 5000, 10) "Credit Group"
   FROM customers WHERE nls_territory = 'SWITZERLAND'
   ORDER BY "Credit Group", customer_id, cust_last_name, credit_limit;

CUSTOMER_ID CUST_LAST_NAME       CREDIT_LIMIT Credit Group
----------- -------------------- ------------ ------------
        825 Dreyfuss                      500            1
        826 Barkin                        500            1
        827 Siegel                        500            1
        853 Palin                         400            1
        843 Oates                         700            2
        844 Julius                        700            2
        835 Eastwood                     1200            3
        836 Berenger                     1200            3
        837 Stanton                      1200            3
        840 Elliott                      1400            3
        841 Boyer                        1400            3
        842 Stern                        1400            3
        848 Olmos                        1800            4
        849 Kaurusmdki                   1800            4
        828 Minnelli                     2300            5
        829 Hunter                       2300            5
        850 Finney                       2300            5
        851 Brown                        2300            5
        852 Tanner                       2300            5
        830 Dutt                         3500            7
        831 Bel Geddes                   3500            7
        832 Spacek                       3500            7
        833 Moranis                      3500            7
        834 Idle                         3500            7
        838 Nicholson                    3500            7
        839 Johnson                      3500            7
        845 Fawcett                      5000           11
        846 Brando                       5000           11
        847 Streep                       5000           11

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1514350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HBuilder发行微信小程序

首先需要完善mainifest.json中的基本配置 这个需要组测dcloud才可以获取&#xff0c;注册后点击重新获取就可以。 然后发行前还需要完成dcloud的信息&#xff0c;这个他会给你网址 点击连接完成信息填写就可以了 然后就可以发行了。 发行成功后会自动跳转微信小程序&#xff…

uniapp封装统一请求(get和post)

uniapp封装请求 request.js文件 import Vue from vue // 全局配置 import settings from ./settings.js function computedBaseUrl(url) {// console.log(url);return (url.indexOf(http) -1 ? settings.baseUrl : ) url }// 发送请求 export default (options) > {const…

一.java介绍和idea基础使用

java技术体系 Java技术体系说明Java SE(Java standard Edition):标准版Java技术的核心和基础Java EE(Java Enterprise Edition):企业版企业级应用开发的一套解决方案Java ME(Java Micro Edition):小型版针对移动设备应用的解决方案&#xff08;认可少&#xff0c;主要是安卓和…

基于Vue移动端电影票务服务APP设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 Vue框架 3 1.2 数据库MongoDB 3 1.3 Axios请求 3 1.4 H5、CSS3和JavaScript 4 1.5 本章小结 4 2 系统分析 5 2.1 功能需求 5 2.2 用例分析 5 2.3 用户功能 6 2.4本章小结 6 3 基于Vue电影票务服务APP设计 7 3.1 页面设计 …

Java_8 移除元素

移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出…

微信小程序之表单组件

1、button 常用的属性&#xff1a; 属性类型默认值必填说明sizestringdefault否按钮的大小 合法值说明default默认大小mini小尺寸typestringdefault否按钮的样式类型 合法值说明primary绿色default白色warn红色plainbooleanfalse否按钮是否镂空&#xff0c;背景色透明disable…

Transformer原理

在《机器学习综述》中大致罗列人工智能常见算法&#xff0c;近些年深度学习发展快速&#xff0c;其中Transformer为甚&#xff0c;其英文的意思是变形金刚&#xff0c;对的就是我们看电影变形金刚的意思。Transformer是大语言模型的基础&#xff0c;比如现在常见的GPT、Bert、P…

详解Python中%r和%s的区别及用法

首先看下面的定义&#xff1a; %r用rper()方法处理对象 %s用str()方法处理对象 函数str() 用于将值转化为适于人阅读的形式&#xff0c;而repr() 转化为供解释器读取的形式&#xff08;如果没有等价的语法&#xff0c;则会发生SyntaxError 异常&#xff09; 某对象没有适于人…

数据库增删改查以及联合查询——数据库——day1

今天学习了数据库的知识 首先数据库分为关系型数据库和非关系型数据库 关系型数据库:Mysql OracleSqlServerSqlite 非关系型数据库&#xff1a;RedisNoSQL我们首先来看一下数组、链表、文件、数据库的区别 数组、链表: 内存存放数据的方式(代码运行结束、关机数据丢失) …

JS数组相关知识

获取数组的最大值/最小值&#xff1a; let arrary [2,5,4] let max arrary[0] for(let i 0;i<arrary.length;i){if(arrary[i]>max){max arrary[i]} }console.log(max);//查询数组最小值let arr [2,21,34,23,45] let min arr[0] for(let i 0;i<arr.length;i){if…

“我快无聊死了”用英语怎么说?柯桥英语口语学习,成人零基础学外语

每日一句 Im bored to death. 我快无聊死了。 单词解析&#xff1a; bored / bɔːd / adj.无聊的&#xff0c;厌倦的 bored to d15857575376eath&#xff1a;指非常无聊或厌烦&#xff0c;达到了极点的程度。 "bored" 和 "boring" 都与无聊相关&#…

蓝桥杯练习系统(算法训练)ALGO-980 斐波那契串

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;10.0s Java时间限制&#xff1a;30.0s Python时间限制&#xff1a;50.0s 问题描述 斐波那契串由下列规则生成&#xff1a;   F[0] "0";   F[1] "1";   F[n] F[n-1] F[n-2]…

AI人工智能改变项目管理及控制的5种方式,最后一个你认同吗?

前言 斯蒂芬霍金说&#xff1a;“AI is likely to be either the best or the worst thing to happen to humanity. 人工智能可能是发生在人类身上的最好或最坏的事情”。根据Gartner的说法&#xff0c;它将是前者。它预测到2020年&#xff0c;人工智能将减少1万个就业机会&am…

软件设计师15--进程资源图

软件设计师15--进程资源图 考点1&#xff1a;进程资源图例题&#xff1a; 考点1&#xff1a;进程资源图 例题&#xff1a; 1、在如下所示的进程资源图中&#xff0c;D&#xff09;。 A、P1、P2、P3都是非阻塞节点&#xff0c;该图可以化简&#xff0c;所以是非死锁的 B、P1、…

Linux:1_常见指令以及权限理解(上)

常见指令以及权限理解 一.补充知识 为方便初学者更好的理解Linux系统,这部分将对比windows系统补充一部分必要知识1 2 3 4 5 6 二.补充指令 1. 重新认识指令: 指令本质都是程序 —指令、程序、可执行程序都是一回事(都是文件内容属性)指令就是程序 … 安装和卸载是在把可…

【Axure高保真原型】下拉列表切换图表

今天和大家分享通过下拉列表动态切换统计图表的原型模板&#xff0c;我们可以通过下拉列表选择要显示的图表&#xff0c;包括柱状图、条形图、饼图、环形图、折线图、曲线图、面积图、阶梯图、雷达图&#xff1b;而且图表数据可以在左侧表格中动态维护&#xff0c;包括增加修改…

深入理解Vue3中利用mitt:实现轻量级事件监听与触发

深入理解Vue3中利用mitt&#xff1a;实现轻量级事件监听与触发 摘要&#xff1a;本文将介绍如何在Vue3中利用mitt库实现轻量级的事件监听与触发。我们将详细介绍mitt库的特性和使用方法&#xff0c;并通过实际示例展示如何在Vue3组件中应用mitt。 一、引言 在前端开发中&…

LeetCode24.两两交换链表节点

24.两两交换链表中的节点 这道题&#xff0c;重点在于理清楚各个指针之间的关系。 链表的题一定要注意断链和连接的顺序&#xff0c;有时候需要申请新的节点来保存某个节点&#xff0c;防止断链 24。题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交…

Selenium Web自动化测试——基于unittest框架的PO设计模式

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

回归测试,有什么高效的测试方法?

什么是回归测试&#xff1f; 回归测试&#xff08;Regression testing&#xff09; 指在发生修改之后重新测试先前的测试以保证修改的正确性。理论上&#xff0c;软件产生新版本&#xff0c;都需要进行回归测试&#xff0c;验证以前发现和修复的错误是否在新软件版本上再次出现…