PL/SQL 学习:
看了点PL/SQL 的基础这里Mark下……在官网下的操作手册,英文的有的理解不对的请见谅~
自定义数据类型,这个用法有点C语言。可以重新给数据类型一个表示符:
自定义[number][6]类型
DECLARE
subtype Balance IS NUMBER(6,4);
test_number Balance(5,4);
BEGIN
test_number := 3.283;
dbms_output.put_line(test_number);
END;
这小段代码用subtype 关键字 重定义了一个[NUMBER(6,4)][6],这个就是重定义的数据类型的最高精度。在下面的变量声明中如果写成 [balance(5,5)][6],将抛出异常。
自定义整形(PLS_INTEGER):
[PLS_INTEGER][6] 这个类型比较神奇,我看的手册上说这个速度快,好像还是一个‘父’类型。
DECLARE
-- 自定义一个数据类型 范围在 0..9
SUBTYPE Digit
IS
PLS_INTEGER RANGE 0..9;
-- 声明、初始化 变量
d Digit := 4;
v VARCHAR2(23) := '3';
BEGIN
dbms_output.put_Line(d);
--这里主要想试一下 varchar 类型的到PLS_INTEGER 会不会异常 ,结果不会
d := TO_NUMBER(v); -- d := v;
dbms_output.put_line(d);
END;
如果赋值的是小数,毫无疑问精度会丢失。
原因:
case 语句:
eg:
DECLARE
grade CHAR(1);
BEGIN
grade := 'B';
CASE grade
WHEN 'A' THEN
dbms_output.put_line('Very Good.');
WHEN 'B' THEN
dbms_output.put_line('Good.');
WHEN 'C' THEN
dbms_output.put_line('Just So.');
END CASE;
dbms_output.put_line(mod(2,11));
END;
case语句 如果CASE关键字 后面的 grade 缺省,when 关键字后面就要写成[grade = ‘A’][6]。
程序包:
程序包是回话级别的,对于每一个连接,对其成员变量修改,后面可以访问。再次连接的时候,又恢复到默认值。但是有一个编译指令,可以让程序包每次执行的时候都恢复默认值。
CREATE OR REPLACE PACKAGE my_type
IS
TYPE my_aa
IS
TABLE OF VARCHAR2(20) INDEX BY PLS_INTEGER;
FUNCTION Init_my_aa
RETURN my_aa;
END my_type;
这个程序包里面定义了一个[table][6] 类型的 变量(有点像数组)。然后定义了一个函数。
创建包体
在创建包体的时候如果包体中没有实现包头中定义的函数或者存储过程,就会出错(所以我觉得包体有点接口的样子)。
CREATE OR REPLACE PACKAGE BODY my_type
IS
FUNCTION Init_my_aa
RETURN my_aa
IS
ret my_aa;
BEGIN
ret (-10) := '-tn';
ret(0) := '0';
ret(1) := '1';
ret(2) := '2';
RETURN ret;
END Init_my_aa;
end my_type;
调用方式
DECLARE
v CONSTANT my_type.my_aa := MY_TYPE.INIT_MY_AA();
BEGIN
DECLARE
Idx PLS_INTEGER := v.FIRST();
BEGIN
WHILE Idx IS NOT NULL
LOOP
dbms_output.put_line(Idx|| ':'|| v(Idx));
Idx := v.NEXT(Idx);
END LOOP;
END;
END;
mark完了。