您的位置:首页 > 数据库 > Oracle

oracle学习笔记

2016-07-26 08:01 471 查看
书籍
1、oracle实用教程
2、深入浅出oracle
选择数据库的条件
1、项目的规模
(1)用户量有多大,即负载有多大
(2)成本
(3)安全性

sys用户是 超级用户, 具有最高权限,具有sysdba角色。
system用户是 管理操作员,权限也很大,具有sysoper角色。
对于数据库维护,system登陆就可以了。
新装一个数据库就是使用了一个oracle数据库实例
show user;显示当前用户
exit; 退出
conn system/manager;这是一种连接方式,斜线分割用户名和密码
普通用户无法修改别人密码。
passw;修改密码 只能在sql-plus中使用
start 和@ 用于运行sql脚本,
@ d:\a.sql
edit d:\a.sql
spool d:\b.sql执行该命令后,将当前命令行后内容写入到指定文件夹。
然后spool off结束。
select * from t_name where name = '&name';用户可以输入变量

oracle 表名 必须以字母开头,长度不能超过30字符
char 最大字符为2000 定长类型的,但是查询效率高
varchar2
clob 字符型大对象 最大4G
number数值类型
number(5,2)代表5为有效数字,2位小数,-999.99-999.99
日期类型
date 包含年月日时分秒
timestamp 精度更高
blob图片、声音、视频等 二进制数据,4G
处于安全考虑,才会将这些信息保存,一般情况是将路径存储到数据库中,将资源放在对应的文件下面

---------------------------------------------------------------------------------------------------

PL/SQL

Procedural Language/SQL 过程性语言/SQL,将SQL(一种4GL)的强大性和灵活性与(3GL)的过程性洁结构融为
一体

1.2 PL/SQL的功能特性
1.2.1 块结构
申明部分--可选
执行部分--必须
异常部分--可选

1.2.2 变量和类型
1、PL/SQL变量可以与数据库列拥有相同的类型
2、可以拥有PL/SQL中的类型
3、支持用户定义的类型:表(table) 记录(record)
4、支持创建对象类型
1.2.3 循环结构

1、简单循环 loop
2、for循环 for v_id in (select e1.empno, e1.ename from emp e1)
declare
v_id number(1); -- 相当于是一个中间表存储结构
v_name varchar2(40);
begin
for v_id in (select e1.empno, e1.ename from emp e1)
loop
select e.ename into v_name from emp e where e.empno = v_id.empno;
dbms_output.put_line(v_id.empno || '--' || v_name || '--' || v_id.ename);
end loop;
end;

3、游标 申明跳出语句
DECLARE
v_empno NUMBER(10);
v_ename VARCHAR2(40);
CURSOR c_emp IS
SELECT e.empno, e.ename FROM emp e;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp
INTO v_empno, v_ename;
EXIT WHEN c_emp % NOTFOUND;
dbms_output.put_line(concat(concat(v_empno, '--'), v_ename));
END LOOP;
CLOSE c_emp;--关闭游标
END;
游标和for循环比较来看
游标的风格更加规范,严谨
for循环的方式更加灵活,效率较高

-----------------------------------第二章 PL/SQL基础------------------------------

2.1 PL/SQL块
1、块分类
匿名块
标签块
子程序
触发器
2、块结构的一般组成部分
申明部分
执行部分
异常部分
2.2 词法单位
2.2.1标识符
2.2.2分界符
2.2.3文字符
2.2.4注释
2.3 变量申明
2.3.1 申明语法
variable_name type [CONSTANT] [NOT NULL] [:=/DEFAULT value];
一行中只需要申明一个变量,如果变量为常量值或者NOT NULL,在初始化时必须为其赋值,在最初赋值时,最好使用DEFAULT
2.4 PL/SQL 类型
2.4.1 数值型
NUMBER 存储整数或实数
BINNARY_INTEGER 存储整数,以二进制的方式进行存储,由oracle模拟执行的,速度低于PLS_INTEGER
PLS_INTEGER 存储整数,以二进制的方式进行存储,不过它的运算是直接由硬件执行的
2.4.2 字符型
char
varchar2
varchar
long
2.4.3 原族
存储二进制
2.4.4 日期族 占用7个字节
2.4.5 布尔族 只能存储true false null
2.4.6复合类型
2.4.7引用类型
2.4.8LOB类型 存储大文本
2.4.9使用 % TYPE
DECLARE
v_firstname student.firstname % TYPE --通过这种方式,当表中的列属性发生变化,此处不需要修改代码
v_firstname2 v_firstname % TYPE-- 这种方式也是可行的
2.4.10用户定义子类型
DECLARE
SUBTYPE t_selfDefine IS NUMBER; --此处不能限制存储空间的大小
不过可以通过这种方式
DECLARE
v_num NUMBER(10);
SUBTYPE t_selfDefine IS v_num % TYPE;
或者通过这种方式
v_variable t_selfDefine(10);进行限制
2.4.11 在数据类型之间进行转换
显示转换--通过oracle自带的函数进行
隐式转换--通过数据类型格式的范围和限制约定进行
为了能够使编程风格更加简约,明了,最好在隐式转换的基础上使用函数进行显示转换
2.4.12 变量的作用域和可见性
如果一个变量在作用域中,则是可见的,如果不在其中,则是不可见的
对于一个变量在作用域中,但是是不可见的,需要通过标签的方式进行引用
2.5 表达式和运算符
2.6 PL/SQL的控制结构
1、IF-THEN-ELSE END IF;
LOOP EXIT WHEN [condition] END LOOP;
WHILE condition LOOP END LOOP;
FOR v_temp IN REVERSE v_lowValue .. v_highValue LOOP
END LOOP;
GOTO 和标号
NULL;语句只是一个占位符,不执行任何操作
2.7 PL/SQL风格指南
2.7.1注释风格
在每个块前面注释,说明当前块的目的,说明作者,时间,目的,是否有返回值,
在申明变量的后面使用行注释,说明该变量的作用域和目的
在每一个核心的算法上面申明注释,说明该算法的具体作用。
2.7.2 变量名风格
v_variableName
2.7.3 大写风格

------------------------------------第三章 记录和表------------------------------------------
3.1 记录 RECORD
记录其实就是一个视图,对需要查询的结果集进行缓存
TYPE r_recordname IS RECORD(
field1 table.columnname % TYPE,
field2 NUMBER(10),
field3 VARCHAR(30) NOT NULL DEFAULT ''
)

v_record r_recordname;
v_record table % ROWTYPE;--这也是一种申明记录的方式
如果遍历一个多行的记录,需要借助TABLE类型进行,记录可以通过.的方式直接引用
3.2 表
表就是一个数组,不过其存储的形式是以键值对的形式进行的
表中可以存储记录,通过这种方式就可以模拟出游标的遍历方式
在使用的表的过程中,索引值最好是连续的,这样不会导致需要存储的值被覆盖
如果表未被赋值,则取值会出现报错
如果需要清空一个表,只需要赋值一个空表就可以了
TYPE t_tablename IS TABLE OF typename;
typename 可以为NUMBER,VARCHAR2, RECORD
--------------------------------------------4 在 PL/SQL中使用SQL------------------------------
4.2.1
在PL/SQL中不能使用DDL,DCL语句只能够使用DML、DQL语句、事物控制语句
早期编译和晚期编译之间的区别相当于静态编译和动态编译之间的区别
因此在PL/SQL中不能修改表结构等语句的出现。
4.2.2在PL/SQL中使用DML
4.3伪列
NEXTVAL CURRVAL这是序列的伪列
ROWNUM行号
ROWID行标识符
4.4权限
权限与角色,
权限分为对象权限和系统权限
角色就是分组,对一组有共同权限的用户进行权限设置
GRANT REVOKE
4.5事务控制
oracle中事务开启是一个隐藏的过程,如果需要严格的事务控制,需要使用保存点的方式进行,即在代码块的开始处设置保存点,
如果出现异常就回滚到最初保存点即可
例如
BEGIN
SAVEPOINT A;
update table_a set money = money -300;
update table_b set money = money + 300;
COMMIT;
EXCEPTION: ROLLBACK TO A;
END;

-----------------------------------5 内置的SQL函数----------------------------------------------

单值函数 多值函数
字符函数
select ASCII('a') as "数值", CHR(97) as "字符" from dual;

SELECT CONCAT(ASCII('a'), CHR(97)) as "连接" from dual;

SELECT INITCAP('this is a test sql') from dual;

SELECT LOWER('ZHAOJUNYANG') FROM dual;

SELECT LPAD('short string' 15) from dual;

SELECT LTRIM('xyxxxxystring', 'xys') FROM dual;

SELECT REPLACE('zhaojunyang', 'a', 'b') from dual;

SELECT RPAD('zhaojunyang', 20, 'n') from dual;

SELECT RTRIM('xyxxxxystringxxxx', 'xyg') FROM dual;

SELECT SUBSTR('zhaojunyang', -5, 5) from dual;

SELECT SUBSTRB('zhaojunyang', 2, 6) from dual;

SELECT TRANSLATE('zhaojunyang', 'zhao', ' ') from dual;

SELECT REPLACE('zhaojunyang', 'zhao', ' ') from dual;

SELECT UPPER('zhaojunyang') FROM dual;

SELECT ASCII('b') from dual;

SELECT INSTR('zhaojunyang', 'a', 1, 2) from dual;

SELECT LENGTH('zhaojunyang') from dual;

数值函数

SELECT ABS(-11) from dual;

SELECT ACOS(0) * 180/ 3.1415926 from dual;

SELECT ASIN(0) from dual;

SELECT ATAN(1) from dual;

SELECT ATAN2(1, 1) from dual;

SELECT CEIL(18.1) from dual;

SELECT FLOOR(18.1) from dual;

SELECT MOD(10, 3) from dual;

SELECT POWER(2, 3) from dual;

SELECT ROUND(1.56), ROUND(1.56, 1) from dual;

SELECT SIGN(100), SIGN(-100) from dual;

SELECT SQRT(66) from dual;

SELECT TRUNC(10.232, 2) from dual;

日期函数
SELECT add_months(to_date(sysdate, 'dd-MM-yyyy'), 1) from dual;

select to_char(add_months(to_date('2012-11-22 10:00:00',
'yyyy-mm-dd,hh24:mi:ss'),
2),
'yyyy-mm-dd hh24:mi:ss')
from dual;

select to_date('2005-12-25,13:25:59','yyyy-mm-dd,hh24:mi:ss') from dual

select LAST_DAY(to_date('2015-12-25 13:25:59', 'yyyy-mm-dd hh24:mi:ss')),
(LAST_DAY(to_date('2015-12-25 13:25:59', 'yyyy-mm-dd hh24:mi:ss')) -
to_date('2015-12-25 13:25:59', 'yyyy-mm-dd hh24:mi:ss')) as interval
from dual;

--在中文字符集下的日期函数的使用
SELECT NEXT_DAY(to_date('2015-07-27', 'yyyy-mm-dd'),
case 'TUESDAY'
when 'MONDAY' then '星期一'
when 'TUESDAY' then '星期二'
when 'WEDNESDAY' then '星期三'
when 'THURSDAY' then '星期四'
when 'FRIDAY' then '星期五'
when 'SATURDAY' then '星期六'
when 'SUNDAY' then '星期日'
end ) as "NEXT_DAY"
from dual;

select next_day('01-8月-03', '星期一') from dual;

-- 时间截取函数
select trunc(sysdate, 'month') from dual;

select round(sysdate, 'month') from dual;
--转换函数

--分组函数

select t.deptno, AVG(t.sal) from t_emp t group by t.deptno order by t.deptno;

select t.deptno, COUNT(t.sal) from t_emp t group by t.deptno order by t.deptno;

select t.deptno, max(t.sal) as result from t_emp t group by t.deptno order by result;

select t.deptno, min(t.sal) as result from t_emp t group by t.deptno order by result;

select t.deptno, stddev(t.sal) as result from t_emp t group by t.deptno order by result;

select t.deptno, sum(t.sal) as result from t_emp t group by t.deptno order by result;

select t.deptno, variance(t.sal) as result from t_emp t group by t.deptno order by result;

-- 其他函数
decode、 nvl 等这样的函数,最好还是使用if-else等case when

oracle中函数主要分为字符函数、数值函数、时间函数、统计函数、转换函数、其他函数等,通过使用这些函数可以节省代码的编写,
另外,对于系统字符集的设置应该独自开发转换函数,例如星期转换函数,日期转换函数等。

-----------------------------------------------6 游标--------------------------------------------------------------
6.1游标
为了处理SQL语句,Oracle必须分配一片内存区域,这就是上下文区(context area)
6.1.1显示游标
1、申明游标 Cursor c_name IS SELECT ...
2、打开游标 OPEN c_name
3、提取记录 FETCH c_name INTO ...
4、关闭游标 CLOSE c_name
游标属性
% NOTFOUND % FOUND % ISOPEN % ROWCOUNT
参数化游标
Cursor c_name(parameter1, parameter2) IS SELECT * from where parameter1, parameter2;
6.1.2隐式游标 又称为SQL游标
用于处理UPDATE、DELETE、INSERT和SELECT INTO 等操作
SQL % NOTFOUND
不过SELECT INTO中如果没有查找到值,则会出现NO DATA FOUND异常,将会交由异常处理,
6.2 游标提取循环
6.2.1简单循环
EXIT WHEN c_name % NOTFOUND ;这句话要紧跟fetch值后面

关于游标的理解
游标是对查询语句的字段值截取一个快照,既OPEN之前的任何操作,游标中是可以看到的,OPEN之后的任何操作是无法看到的,
如果OPEN之后,其他会话更改了游标中的行信息,则不会再游标中显示,除非,再次打开游标,重新截取快照。如果为了保证
在游标截取的过程中,对游标结果集的行进行锁定,则可以通过for update 这种方式进行,对行加入互斥锁。
注意
游标与锁的关系,如果游标没有带锁,则同步线程同时截取快照并进行修改,会出现数据一致性问题。
如果需要在游标中需要对当前行执行update或者delete操作需要使用for update,先将当前行记录锁定,然后再执行后续操作

6.3游标变量
TYPE type_name IS REF CURSOR RETURN return_type; return_type必须是一个记录类型
动态游标分为限制游标和非限制游标,这种定义只是为了说明游标类型是否带返回类型,如果不带返回类型,则是一个非限制游标
否则就是一个限制游标
DECLARE
TYPE c_type_emp IS REF CURSOR;-- 申明一个游标类型,非限制类型
v_cursor_emp c_type_emp;
v_empno emp.empno % TYPE;
v_ename emp.ename % TYPE;
v_record_emp emp % ROWTYPE; --这是一个记录,存储emp表的信息
BEGIN
OPEN v_cursor_emp for select * from emp;
LOOP
FETCH v_cursor_emp INTO v_record_emp;
EXIT WHEN v_cursor_emp % NOTFOUND;
DBMS_OUTPUT.PUT_LINE(CONCAT(
CONCAT(
CONCAT(
CONCAT(v_record_emp.empno, '--'),
v_record_emp.ename),
'--'), v_record_emp.sal
));
END LOOP;
CLOSE v_cursor_emp;
END;

隐式游标
DQL语句和DML语句,系统都会使用一个隐式游标
隐式游标的名字固定为SQL,隐式游标只能处理单行数据
BEGIN
update table_name set ...
/*modify by zhao.junyang */
/*IF SQL % NOTFOUND THEN*/
IF SQL % ROWCOUNT = 0 THEN
insert into table_name...
END IF;
END;

-----------------------------------------------7 子程序:过程和函数----------------------------------------------------------

CREATE OR REPLACE PROCEDURE batchInsert(p_num IN NUMBER) IS
DECLARE
v_num number(10);
BEGIN
FOR v_num IN (SELECT * FROM t_emp) LOOP
INSERT INTO t_emp(empno, ename, job, mgr, hiredate, sal, comm, deptno) values (seq_t_emp.NEXTVAL, v_num.ename, v_num.job, v_num.mgr, v_num.hiredate, v_num.sal, v_num.comm, v_num.deptno);
END LOOP;
COMMIT;
END;
7.1.1 过程
参数和模式
参数类型不需要限制长度
三种模式
IN 只读模式
INOUT 读写模式
OUT 只写模式
过程主体
申明部分
执行部分
异常部分
形式参数约束
只能通过 % TYPE 这种方式进行,但是一般还是在过程的入口进行校验
位置标志法和带名标志法
根据习惯进行选择,我选择位置标志法
参数缺省值,如果使用位置标志法,缺省值必须放在参数列表中的最后面,
7.1.2函数
CREATE OR REPLACE FUNCTION statisticRow(p_num NUMBER) RETURN BOOLEAN IS
v_return_flag BOOLEAN NOT NULL DEFAULT FALSE;
v_count NUMBER(30) NOT NULL DEFAULT 0;
BEGIN
SELECT COUNT(*) INTO v_count FROM t_emp;
IF v_count > 10000
THEN
v_return_flag := TRUE;
ELSE
v_return_flag := FALSE;
END IF;
RETURN v_return_flag;
END statisticRow;
这种函数的使用,返回值为boolean的话,不能够被select语句使用的

7.1.3 子程序中的异常
如果子程序中发生异常,且程序中没有异常处理程序,则程序会立即终止执行,过程中out和inout参数则无输出值,如果是函数则会立即停止,不会又返回值
7.2
本地子程序和内置子程序
本地子程序就是在一个过程或函数中的申明部分在申明一个过程或函数,相当于java中的内部类
内置子程序就是被数据库编译之后存储在数据库中,以被共享

-----------------------------------------------8 包------------------------------------------------------------------
包和包体之间是一种实现的关系,如果包中没有过程和函数的申明,则可以不存在包体,如果包中存在过程和函数,则需要在包体中对过程和函数进行实现
包简单的理解就是一种管理规范,将同一类数据字典值,放在一起,便于统一的引用。

包--仅仅是一种申明
CREATE OR REPLACE PACKAGE package_test IS

FUNCTION test1(p_num NUMBER) RETURN NUMBER;

FUNCTION test3(p_num NUMBER) RETURN NUMBER;

END package_test;

包主体--对包中的申明进行实现,如果包中不包含任何函数和过程,则可以没有包主体。

包中的函数和过程可以进行重载,既只要参数不同即可
CREATE OR REPLACE PACKAGE BODY package_test IS

FUNCTION test1(p_num NUMBER) RETURN NUMBER
IS
v_return NUMBER;
BEGIN
IF p_num >= 1 THEN
v_return := 1;
ELSE
v_return := 0;
END IF;
return v_return;
END test1;

FUNCTION test3(p_num NUMBER) RETURN NUMBER
IS
v_return NUMBER;
BEGIN
IF p_num >= 10 THEN
v_return := 1;
ELSE
v_return := 0;
END IF;
return v_return;
END test3;

END package_test;

8.2在SQL中调用内置函数
该函数必须被存储在数据库中,而不是本地函数
该函数只接受in参数
形式参数必须只能使用数据库类型,而不是PL/SQL类型,BOOLEAN,RECORD等是PL/SQL类型
数据库类型NUMBER、CHAR、VARCHAR2、ROWID、LONG、LONG RAW、DATE
该函数的返回类型必须是数据库类型

-----------------------------------------------9 触发器---------------------------------------------------------------
触发器组件
触发器名--可以和表名相同,但是最好使用唯一的命名标识
触发器类型
语句 insert update delete
定时 before after
级别 行或语句 for each row,行级别,对每一行进行锁定,如果被锁定的行被触发器内部使用,则会引发错误

instead of 触发器,专门为视图设计,为了视图中的删除,更新操作而建立的
触发器的限制
触发器中不应该使用事务控制语句,触发器内部的控制语句与触发语句的事务保持一致性。
触发器中调用的过程和函数不能存在事务控制语句
触发器中不能申明任何LONG或LONG RAW变量
删除和禁止触发器
DROP TRIGGER trigger_name
ALTER TABLE table_name DISABLE | ENABLE ALL TRIGGERS
触发器执行次序
语句级 BEFORE
行级 BEFORE
语句级 AFTER
行级 AFTER
在行级触发器中使用 :OLD :NEW 伪记录,类似与记录,但是只能通过.的方式获取属性
触发器谓词 INSERTING、UPDATING、DELETING,三个布尔值决定出发的动作应该如何进行实现

变化表

变化表就是被DML语句正在修改的表,对于触发器而言,他就是定义触发器的表,但是对于级联删除的表而言,与其关联的表
也是变化表
行级触发器始终将触发表当做变化表,因此行级触发器中不允许出现对触发表操作的任何语句,包括select
消除变化表的错误,就是将语句触发器和行级触发器结合起来,行级触发器只讲中间结果保存在全局变量中,一般采用
包的形式就行设计,然后在使用语句触发器对触发表进行操作。
before 行级触发器 after 语句级触发器

级联操作的实现原理就是通过触发器的方式进行实现的

CREATE [OR REPLACE] TRIGGER trigger_name BEFORE|AFTER [trigger_event] ON table_reference
[FOR EACH ROW [WHEN trigger_condition]]

CREATE OR REPLACE TRIGGER trigger_test AFTER INSERT OR DELETE OR UPDATE ON t_emp

DECLARE
TYPE r_t_emp IS RECORD (
empno t_emp.empno % TYPE,
ename t_emp.ename % TYPE
);
CURSOR c_t_emp IS select t.empno, t.ename from (select rownum rn, t.* from t_emp t where rownum <= 10) t where t.rn > 5;
v_record_t_emp r_t_emp;

BEGIN
OPEN c_t_emp;
LOOP
FETCH c_t_emp INTO v_record_t_emp;
EXIT WHEN c_t_emp % NOTFOUND;
dbms_output.put_line(CONCAT(CONCAT(v_record_t_emp.empno, '--'), v_record_t_emp.ename));
END LOOP;
CLOSE c_t_emp;
END;

-----------------------------------------------10 错误处理------------------------------------------------------------
异常情态
自定义异常情态
异常申明
e_exceptionname EXCEPTION;在申明区域申明
使用RAISE进行手动触发

PROCEDURE SP_TESTEXCEPTION (p_in_num1 IN NUMBER, p_in_num2 NUMBER, p_out_result OUT VARCHAR2) IS
e_calculate EXCEPTION; --异常申明
v_num1 NUMBER(10);
v_num2 NUMBER(10);
v_result NUMBER(10);
BEGIN
-----------------init------------------------
v_num1 := p_in_num1;
v_num2 := p_in_num2;
-----------------exec------------------------
IF v_num2 = 0 THEN
RAISE e_calculate;
ELSE
v_result := v_num1 / v_num2;
END IF;
p_out_result := v_result;
EXCEPTION
WHEN e_calculate THEN
DBMS_OUTPUT.PUT_LINE('this is a error!');
p_out_result := 'infinite';
END SP_TESTEXCEPTION;

一旦异常出现,程序将没有办法返回到该块的执行部分
异常处理器,就是识别哪类异常发生,并作出执行动作
OTHERS 异常处理器 对所有引发的异常情态执行其代码

预定义异常情态

处理异常情态
当引发一个异常情态时,控制便会转给块的异常情态部分。
异常情态部分包含了所有异常情态的处理器,

自定义异常处理消息

在包中定义异常,能够在全局中进行使用

避免未处理的异常情态是一个很好的变成风格

例如如下这种情况就是非常不错的方式

EXCEPTION

WHEN OTHERS THEN

一定要存在一个others来作为异常最终捕获

屏蔽错误位置的发生

一般采用两种方法解决

第一种方式是对一个计数器执行加一操作来标识被执行的sql

例如

BEGIN

select * from ...

v_exception_count := v_exception_count + 1;

select * from ...

v_exception_count := v_exception_count + 1;

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(v_exception_count);

END;

另外一种方式就是通过将每条语句放入字块中,这种方式过于麻烦,且影响程序的易读性,因此,我更倾向于选择第一种方式

使用PL/SQL常用错误处理模块 -- 这部分现在还不是很理解,希望以后能够在看看

-----------------------------------------------11 对象------------------------------------------------------------

-----------------------------------------------12 集合----------------------------------------------------------------

-----------------------------------------------13 执行环境--------------------------------------------------------------

-----------------------------------------------14 测试与调试-------------------------------------------------------------

-----------------------------------------------15 动态PL/SQL--------------------------------------------------------------

-----------------------------------------------16 会话间通信------------------------------------------------------------

遇到问题的心得体会

包中过程和函数的申明,必须和包体中完全一样,否则就会报错
如果在写一条SQL语句时,如果出现变量和字段值是一样的情况下,则检索出全部记录,而不会将其视为一个变量
例如 select * from emp where emp_no = emp_no;在过程和函数中使用时变量不应该设置为emp_no,而应该定位p_emp_no;

参数使用以p开头,例如存储过程的参数p_in_name p_inout_name p_out_name;
函数的参数 p_name;
过程和函数中的变量以v_开头v_name
游标以c_开头 c_name
记录类型以r_开头 rd_
记录变量 v_record_name;
表类型以t_开头,或tb_开头
表变量以v_table_开头 v_table_name
对象命名OBJECT_name;以OBJECT开头
对象变量v_object_name 以v_object开头
对象内部的属性和方法全部大写,并加上注释信息
所有类型全部大写
所有变量全部小写
过程和函数中的语句,如果是sql语句,使用小写,如果是其他语句使用大写
申明区
赋值区,对于过程和函数进行入口赋值
执行区
异常区
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: