总的目录和进度,请参见开始读 Oracle PL/SQL Programming 第6版
本章谈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
函数 | 概述 |
---|---|
CEIL | CEIL 返回大于或等于 n 的最小整数 |
FLOOR | 返回等于或小于 n 的最大整数 |
ROUND | ROUND 返回 n 四舍五入到小数点右侧的整数位 |
TRUNC | 返回 n1 截断至 n2 位小数。 如果省略 n2,则 n1 被截断为 0 位。 n2 可以为负数,以截断小数点左侧的 n2 位(使其为零) |
TRUNC函数将数字截断至指定的小数位数。 TRUNC 简单地丢弃超出调用中提供的小数位数的所有值。
作者设计这个练习挺好的:
1.75 | 1.3 | 55.56 | 55.56 | 10 | |
---|---|---|---|---|---|
小数位数 | 0 | 0 | 1 | -1 | 2 |
ROUND | 2 | 1 | 55.6 | 60 | 10 |
TRUNC | 1 | 1 | 55.5 | 50 | 10 |
FLOOR | 1 | 1 | 55 | 55 | 10 |
CEIL | 2 | 2 | 56 | 56 | 10 |
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