PL/SQL学习笔记[1]-基础

 

1、SQL部分

1.1、SQL分类

1、数据查询语句(SELECT 语句):用于检索数据库数据

2、数据操纵语言(Data Manipulation Language,DML):用于改变数据库数据,包括INSERT、UPDATE和DELETE三条语句

3、事物控制语句(Transaction Contorl Language,TCL):用户维护数据库的一致性,包括COMMIT、ROLLBACK和SAVEPOINT三条语句。

3.1 COMMIT 确认已经进行的数据库更改

3.2 ROLLBACK 取消已经进行的数据库更改

3.3 SAVEPOINT 设置保存点,以取消部分数据库改变

4、数据定义语句(Data Definition Language,DDL):用于建立、修改和删除数据库对象。比如CREATE TABLE 、ALTER TABLE和DROP TABLE。DDL语句会自动提交事务

5、数据库控制语言(Data Control Language,DCL):用于执行权限授予和收回操作,包括GRANT和REVOKE两条命令。DCL语句会自动提交事务

5.1 GRANT 命令用户给用户或角色授予权限

5.2 REVOKE 命令用于收回用户或角色所具有的权限。

1.2、SQL语句编写规则

1、SQL关键字不区分大小写;

2、对象名和列名不区分大小写;

3、字符值和日期值区分大小写;

4、SQL语句可以分布在多行,增加可读性;

5、在SQL*Plus中,SQL语句要以分号结束;

1.3、命令行中连接SQL*Plus

  1. -- username:数据库用户名 password:用户密码 @server:主机字符串(网络服务名),连接本地数据库时不需要提供   
  2. sqlplus [username]/[password][@server]  
  3. -- 连接到yt$dev数据库。用户密码为yt   
  4. sqlplus yt$dev/yt  
  5. -- 连接到远程数据库   
  6. sqlplus yt$dev/yt@orcl  
-- username:数据库用户名 password:用户密码 @server:主机字符串(网络服务名),连接本地数据库时不需要提供
sqlplus [username]/[password][@server]
-- 连接到yt$dev数据库。用户密码为yt
sqlplus yt$dev/yt
-- 连接到远程数据库
sqlplus yt$dev/yt@orcl

2、PL/SQL 基础

2.1、PL/SQL 块结构

DECLARE
/*
* 定义部分——定义常量、变量、复杂数据类型、游标、例外
*/
BEGIN
/*
* 执行部分——PL/SQL 语句和SQL语句
*/
EXCEPTION
/*
* 例外处理部分——处理运行错误
*/
END; /* 程序结束标记 */
定义部分以 DECLARE 开始,该部分可省略;
执行部分以 BEGIN 开始,该部分是必须的;
例外处理部分以 EXCEPTION 开始,该部分可选;END为结束标记,分号不能省略。

Notes:DECLARE、BEGIN、EXCEPTION后均无分号

2.2、PL/SQL 块分类

2.2.1 匿名块

没有名称的PL/SQL块。比如:

  1. declare  
  2.   v_name VARCHAR2(20);  
  3. begin  
  4.   select name into v_name from customer  
  5.   where id = &id;   -- &id为替换变量   
  6.   dbms_output.put_line('用户姓名:'||v_name);  
  7. exception   
  8.   when NO_DATA_FOUND THEN  
  9.     dbms_output.put_line('请输入正确的雇员号!');  
  10. end;  
declare
  v_name VARCHAR2(20);
begin
  select name into v_name from customer
  where id = &id;   -- &id为替换变量
  dbms_output.put_line('用户姓名:'||v_name);
exception 
  when NO_DATA_FOUND THEN
    dbms_output.put_line('请输入正确的雇员号!');
end;

 Notes:

1、在SQL*Plus中输入反斜杠调用该过程;

2、dbms_output.put_line生效,需要设置serveroutput为on< set serveroutput on >;

2.2.2 命名块

类似于匿名块。只不过在PL/SQL块前使用<<>>加以标记.比如<<outer>>

  1. declare  
  2.   v_deptname date;  
  3.   v_dname varchar2(10);  
  4. begin  
  5.   <<inner>>  
  6.   begin  
  7.     select register_time into v_deptname from customer  
  8.     where id = &id;  
  9.   end;  
  10.   select name into v_dname from customer  
  11.   where register_time = v_deptname;  
  12.   dbms_output.put_line('地址:'||v_dname);  
  13. end;  
declare
  v_deptname date;
  v_dname varchar2(10);
begin
  <<inner>>
  begin
    select register_time into v_deptname from customer
    where id = &id;
  end;
  select name into v_dname from customer
  where register_time = v_deptname;
  dbms_output.put_line('地址:'||v_dname);
end;

示例中<<outer>>和<<inner>>分别是主块(外层块)和子块(内存块)的标记。这种PL/SQL块被称为命名块。

2.2.3 子程序

2.2.3.1 过程

用于执行特定操作。SQL*Plus中使用 CREATE PROCEDURE 命令建立过程。比如:

  1. CREATE OR REPLACE PROCEDURE update_customer (new_name varchar2,id number) IS  
  2. BEGIN   
  3.   update customer set name = new_name  
  4.   where id = id;  
  5. END;  
CREATE OR REPLACE PROCEDURE update_customer (new_name varchar2,id number) IS
BEGIN 
  update customer set name = new_name
  where id = id;
END;

使用  <call 过程名> 或者  <exec 过程名> 调用过程.

Notes:

1、在 SQL*Plus 中调用可以使用 call 或者 exec ;

2、而在 Oracl SQL Deveploer 中只能使用 call ;

2.2.3.2 函数

函数用于返回特定数据。建立函数时,函数头部必须包含 RETURN 子句,而在函数体内必需要包含 RETURN 语句返回数据。SQL*Plus中使用 CREATE FUNCTION 命令建立函数。比如:

  1. CREATE OR REPLACE FUNCTION id100(ename varchar2)  
  2. return number is  
  3.   id_100 number(10);  
  4. begin  
  5.   select id * 100 into id_100   
  6.   from customer where lower(name) = lower(ename) and rownum < 2;  
  7.   return id_100;  
  8. end;  
CREATE OR REPLACE FUNCTION id100(ename varchar2)
return number is
  id_100 number(10);
begin
  select id * 100 into id_100 
  from customer where lower(name) = lower(ename) and rownum < 2;
  return id_100;
end;
调用:
1、在 SQL*Plus 可以使用绑定变量存放结果var id_100 number(10)call id100('abc') into :id_100;print id_100;2、在查询语句中直接调用:select id_100('abc') from dual;
2.2.3.3 包

包用于逻辑组合相关的过程和函数,由包规范和包体两部分组成。包规范用于定义公用的常量、变量、过程和函数。SQL*Plus中使用 CREATE PACKAGE 命令建立包规范。包规范只包含了过程和函数的说明,因此是无法调用执行的。比如:

  1. CREATE OR REPLACE PACKAGE test_packe is  
  2. procedure update_customer (new_name varchar2,id number);  
  3. function id100(ename varchar2) return number;  
  4. end;  
CREATE OR REPLACE PACKAGE test_packe is
procedure update_customer (new_name varchar2,id number);
function id100(ename varchar2) return number;
end;

SQL*Plus中使用 CREATE PACKAGE BODY 命令建立包体。只有创建了包体后才可以使用该包。比如:

  1. CREATE OR REPLACE PACKAGE BODY test_packe is   
  2. procedure update_customer (new_name varchar2,id number) is  
  3. begin   
  4.     update customer set name = new_name  
  5.     where id = id;  
  6. end;  
  7. function id100(ename varchar2) return number is  
  8.       id_100 number(10);  
  9. begin  
  10.     select id * 100 into id_100   
  11.     from customer where lower(name) = lower(ename) and rownum < 2;  
  12. end;  
  13. end;  
CREATE OR REPLACE PACKAGE BODY test_packe is 
procedure update_customer (new_name varchar2,id number) is
begin 
    update customer set name = new_name
    where id = id;
end;
function id100(ename varchar2) return number is
      id_100 number(10);
begin
    select id * 100 into id_100 
    from customer where lower(name) = lower(ename) and rownum < 2;
end;
end;

调用方式同单独的过程、函数调用方式,唯一不同的是需要在调用过程、函数时需要在其名称前加上名。

call test_packe.update_customer('leeyee',1);

Notes:

1、可以先创建包体。但此时无法访问该包;
2、包头与包体缺一不可,否则无法访问该包;
3、使用 drop package [package name] 时,则包体一起被删除;
4、单独删除包体请使用 drop package body [package body name];
2.2.3.4 触发器

触发器是指隐含执行的存储过程。定义触发器时,必须指定出发事件及触发操作。常用触发时间包括 insert、update和 delete,而触发操作实际上是一个 PL/SQL 块。SQL*Plus中使用 CREATE TRIGGER 命令创建触发器。比如:

  1. create or replace trigger update_custom_register  
  2.   before update of name on customer  
  3.   for each row  
  4. begin   
  5.   :new.register_time := sysdate;  
  6. end;  
  7. -- 调用:   
  8. -- 实际执行的语句为 update customer set name= 'leeyee',register_time = sysdate  where id = 1;   
  9. update customer set name'leeyee' where id = 1;   
create or replace trigger update_custom_register
  before update of name on customer
  for each row
begin 
  :new.register_time := sysdate;
end;
-- 调用:
-- 实际执行的语句为 update customer set name= 'leeyee',register_time = sysdate  where id = 1;
update customer set name= 'leeyee' where id = 1; 
  2.3、变量的定义及使用

2.3.1、标量(Scalar)变量

2.3.1.1 常用标量类型

1.1.1 varchar2(n)  : 可变长字符串。n 最大为32767字节。PL/SQL中 n 不应超过4000字节

1.1.2 char(n): 固定长度字符串。 n 默认为 1, n 最大为32767字节。PL/SQL中 n 不应超过2000字节

1.1.3 number(p,s) : 固定长度整数和浮点数。p-精度,指定数字总位数,s-标度,指定小数点后的位数; number(4,2)定义整数最大2位

1.1.4 date : 日期。固定长度7字节

1.1.5 timestamp : 日期和时间数据。同date,但在显示时除过日期还有时间及上下午标识

1.1.6 long(n) : 变长字符产。类似varchar2,不过 n 最大为32760字节

1.1.7 long raw : 变长二进制数据。最大长度32760字节

1.1.8 boolean : 布尔变量。其值为true|false|null。该类型为PL/SQL数据类型

1.1.9 binary_integer : 整数。数值范围 -214783647 到 214783647 之间。该类型为PL/SQL数据类型

1.1.10 binary_float : 单精度浮点数。赋值时应带后缀f,比如 1.5f

1.1.11 binary_double : 双精度浮点数。赋值时应带后缀d,比如 1.0005d

2.3.1.2 定义标量变量

2.3.1.2.1 语法:indentifier [constant] datatype [not null] [:= | default expr]

indentifier : 变量或常量名称

constant : 指定常量关键词

datatype : 数据类型

not null : 初始化数据不为空

:= : 赋值

default expr : 指定变量默认初始值

2.3.1.2.2 示例

v_name varchar2(10);

v_name constant number(3,2) := 5.5;

v_bool boolean not null default false;

2.3.1.2.3 使用示例

declare

v_name constant varchar2(20) := 'hello 标量使用示例';

begin

dbms_output.put_line(v_name);

end;

2.3.1.2.4 使用%type属性

定义变量时,可以使用 %type 属性声明变量类型为数据表定义类型。

  1. declare  
  2. /*  
  3. *如果这里声明为varchar2(2),当查询赋值时,  
  4. * 实际查询长度大于定义长度则会报错。因此这里使用%type属性,  
  5. * 定义变量 v_name 的类型为表customer字段name的声明类型。  
  6. */  
  7.     v_name customer.name%type;   
  8. begin  
  9.     select name into v_name  from customer where id = 1 ;  
  10.     dbms_output.put_line(v_name);  
  11. end;  
declare
/*
*如果这里声明为varchar2(2),当查询赋值时,
* 实际查询长度大于定义长度则会报错。因此这里使用%type属性,
* 定义变量 v_name 的类型为表customer字段name的声明类型。
*/
    v_name customer.name%type; 
begin
    select name into v_name  from customer where id = 1 ;
    dbms_output.put_line(v_name);
end;

2.3.2、复合(Composite)变量

复合变量是用于存放多个值的变量。

2.3.2.1 PL/SQL 记录

PL/SQL 记录类似高级语言中的结构,每个PL/SQL记录一般都包含多个成员。

2.1.1 语法

TYPE record_name IS RECORD(

column_name {column_type | variable%TYPE | table.column%TYPE},

column_name1 {column_type | variable%TYPE | table.column%TYPE},

...

)

2.1.2 示例

  1. DECLARE  
  2.     TYPE customer_record_type   
  3.     IS  
  4.         RECORD (  
  5.             vname customer.name%type,  
  6.             vmoney customer.money%type  
  7.         );  
  8.         cs_rc_type customer_record_type;  
  9.     BEGIN  
  10.         select name,money into cs_rc_type  
  11.         from customer where  id = 1;  
  12.         dbms_output.put_line('姓名:'||cs_rc_type.vname||' 金额:'||cs_rc_type.vmoney);  
  13.     END;  
			DECLARE
				TYPE customer_record_type 
				IS
					RECORD (
						vname customer.name%type,
						vmoney customer.money%type
					);
					cs_rc_type customer_record_type;
				BEGIN
					select name,money into cs_rc_type
					from customer where  id = 1;
					dbms_output.put_line('姓名:'||cs_rc_type.vname||' 金额:'||cs_rc_type.vmoney);
				END;
2.3.2.2 PL/SQL 表

1、PL/SQL 表类似高级语言中的数组。

2、PL/SQL 表的元素个数没有限制,并且下标没有有下限(可为负)

3、使用 PL/SQL 表时必须首先在定义部分定义 PL/SQL 表类型和表变量,然后在执行部分中引用该表变量

4、不能作为表字段的数据类型

2.3.2.2.1 语法:

TYPE type_name IS TABLE OF

{column_type | variable%TYPE

      | table.column%TYPE} [NOT NULL]

    | table.%ROWTYPE 

    }

[INDEX BY type]; -- 主键类型。9.2前 type 只能为 BINARY_INTEGER。以后可以为字符串

2.3.2.2.2 示例
  1. DECLARE  
  2. TYPE customer_table_type  
  3. IS  
  4.   TABLE of customer.name%type index by binary_integer;  
  5.   name_table customer_table_type;  
  6. BEGIN  
  7.   name_table(0) := '默认姓名';  
  8.   select name into name_table(-1) from customer where id = 1;  
  9.     
  10.   dbms_output.put_line('默认姓名: '||name_table(3));  
  11.   dbms_output.put_line('姓名: '||name_table(-1));  
  12.   dbms_output.put_line('第一索引名称: '||name_table.first); -- 亦可使用first().下同   
  13.   dbms_output.put_line('最后索引名称: '||name_table.last);  
  14.   dbms_output.put_line('最后索引对应值: '||name_table(name_table.last));  
  15.   dbms_output.put_line('数组长度: '||name_table.count);  
  16. END;  
  17. -- PL/SQL 记录、表结合使用的例子   
  18. DECLARE  
  19. TYPE customer_record_type -- 声明record   
  20. IS  
  21.   RECORD  
  22.   (  
  23.     vname customer.name%type,  
  24.     vmoney customer.money%type );  
  25. TYPE customer_table_type -- 声明 table   
  26. IS  
  27.   TABLE of customer_record_type --注意这里的 table 类型为 record   
  28.   index by binary_integer;  
  29.   name_table customer_table_type;  
  30. BEGIN  
  31.   select name,money into name_table(-1) from customer where id = 1;  
  32.     
  33.   dbms_output.put_line('姓名: '||name_table(-1).vname);  
  34.   dbms_output.put_line('金额: '||name_table(-1).vmoney);  
  35. END;  
DECLARE
TYPE customer_table_type
IS
  TABLE of customer.name%type index by binary_integer;
  name_table customer_table_type;
BEGIN
  name_table(0) := '默认姓名';
  select name into name_table(-1) from customer where id = 1;
  
  dbms_output.put_line('默认姓名: '||name_table(3));
  dbms_output.put_line('姓名: '||name_table(-1));
  dbms_output.put_line('第一索引名称: '||name_table.first); -- 亦可使用first().下同
  dbms_output.put_line('最后索引名称: '||name_table.last);
  dbms_output.put_line('最后索引对应值: '||name_table(name_table.last));
  dbms_output.put_line('数组长度: '||name_table.count);
END;
-- PL/SQL 记录、表结合使用的例子
DECLARE
TYPE customer_record_type -- 声明record
IS
  RECORD
  (
    vname customer.name%type,
    vmoney customer.money%type );
TYPE customer_table_type -- 声明 table
IS
  TABLE of customer_record_type --注意这里的 table 类型为 record
  index by binary_integer;
  name_table customer_table_type;
BEGIN
  select name,money into name_table(-1) from customer where id = 1;
  
  dbms_output.put_line('姓名: '||name_table(-1).vname);
  dbms_output.put_line('金额: '||name_table(-1).vmoney);
END;
2.3.2.3 嵌套表(Nested Table)

1、嵌套表类似高级语言中的数组。

2、下标不能为负

3、元素个数没有限制

4、可作为表字段的数据类型

5、使用嵌套表类型作为表字段类型时,需要为其指定专门的存储表。

2.3.2.3.1 语法:

CREATE OR REPLACE TYPE nest_type_name AS OBJECT(

colunm_name column_type,

colunm_name1 column_type,

...

);

CREATE OR REPLACE type_name IS TABLE OF  nest_type_name;

2.3.2.3.2 示例:
  1. -- 创建嵌套表类型对象   
  2. CREATE OR REPLACE TYPE nest_table_type  
  3. AS  
  4.   OBJECT  
  5.   (  
  6.     name   varchar2(20),  
  7.     salary number(4,2) );  
  8.   -- 创建嵌套表对象类型   
  9. CREATE OR REPLACE TYPE emp_array  
  10. IS  
  11.   TABLE OF nest_table_type;  
  12.   -- 创建表   
  13.   CREATE TABLE department  
  14.     (  
  15.       deptno number(2),  
  16.       dname  varchar2(10),  
  17.       employee emp_array -- 声明字段类型为嵌套表类型   
  18.     )  
  19.     NESTED TABLE employee STORE AS employee; -- 为其嵌套表类型指定特定的存储表   
  20.   -- 插入内嵌表   
  21.   insert  
  22.   into department  
  23.     (  
  24.       deptno,  
  25.       dname,  
  26.       employee  
  27.     )  
  28.     values  
  29.     (  
  30.       '1',  
  31.       'leeyee',  
  32.       emp_array( nest_table_type('lee',20), nest_table_type('yeee',30) )  
  33.     );  
  34.   -- 读取内嵌表   
  35.   select * from table  
  36.     (select employee from department  
  37.     );  
-- 创建嵌套表类型对象
CREATE OR REPLACE TYPE nest_table_type
AS
  OBJECT
  (
    name   varchar2(20),
    salary number(4,2) );
  -- 创建嵌套表对象类型
CREATE OR REPLACE TYPE emp_array
IS
  TABLE OF nest_table_type;
  -- 创建表
  CREATE TABLE department
    (
      deptno number(2),
      dname  varchar2(10),
      employee emp_array -- 声明字段类型为嵌套表类型
    )
    NESTED TABLE employee STORE AS employee; -- 为其嵌套表类型指定特定的存储表
  -- 插入内嵌表
  insert
  into department
    (
      deptno,
      dname,
      employee
    )
    values
    (
      '1',
      'leeyee',
      emp_array( nest_table_type('lee',20), nest_table_type('yeee',30) )
    );
  -- 读取内嵌表
  select * from table
    (select employee from department
    );
2.3.2.4 VARRAY 变长数组

1、VARRAY类似于嵌套表,可做为表字段和对象类型属性的数据类型。

2、相对于嵌套表,VARRAY的元素个数是有限制的

3、使用 VARRAY 类型作为表字段类型时,数据值与其他字段数据一起存放在表中,不需要额外指定存储表

2.3.2.4.1 语法:

CREATE OR REPLACE TYPE varray_type_name AS OBJECT (

colunm_name column_type,

colunm_name1 column_type,

...

)

CREATE TYPE type name IS VARRAY(20) OF varray_type_name;

2.3.2.4.2 示例:
  1. -- 创建 VARRAY 类型对象   
  2. CREATE OR REPLACE TYPE var_cus_type  
  3. AS  
  4.   OBJECT  
  5.   (  
  6.     name varchar2(20),  
  7.     age  number(3) );  
  8.   -- 创建 VARRAY 对象类型   
  9. CREATE OR REPLACE TYPE var_type IS VARRAY(20) Of var_cus_type;  
  10. -- 创建表   
  11. CREATE TABLE orders  
  12.   (  
  13.     ordno number(4),  
  14.     createdate date,  
  15.     customers var_type -- 声明字段类型为 VARRAY 类型   
  16.   );                   -- 不需要为 VARRAY 类型的字段指定专门的存储表   
  17. -- 插入   
  18. INSERT  
  19. INTO orders  
  20.   (  
  21.     ordno,  
  22.     createdate,  
  23.     customers  
  24.   )  
  25.   VALUES  
  26.   (  
  27.     1,  
  28.     sysdate,  
  29.     var_type( var_cus_type('leeyee',20), var_cus_type('oxcow',30), var_cus_type('abc',40) )  
  30.   );  
  31. -- 查询   
  32. SELECT *  
  33. FROM TABLE  
  34.   (SELECT customers FROM orders WHERE ordno=1  
  35.   )  
  36. WHERE age > 20;  
-- 创建 VARRAY 类型对象
CREATE OR REPLACE TYPE var_cus_type
AS
  OBJECT
  (
    name varchar2(20),
    age  number(3) );
  -- 创建 VARRAY 对象类型
CREATE OR REPLACE TYPE var_type IS VARRAY(20) Of var_cus_type;
-- 创建表
CREATE TABLE orders
  (
    ordno number(4),
    createdate date,
    customers var_type -- 声明字段类型为 VARRAY 类型
  );                   -- 不需要为 VARRAY 类型的字段指定专门的存储表
-- 插入
INSERT
INTO orders
  (
    ordno,
    createdate,
    customers
  )
  VALUES
  (
    1,
    sysdate,
    var_type( var_cus_type('leeyee',20), var_cus_type('oxcow',30), var_cus_type('abc',40) )
  );
-- 查询
SELECT *
FROM TABLE
  (SELECT customers FROM orders WHERE ordno=1
  )
WHERE age > 20;

2.3.3、参照(Reference)变量

1.参照变量是指存放数值指针的变量

2.使用参照变量可以使得应用程序共享相同对象,降低占用空间。

3.常用参照变量类型有游标变量和对象类型变量

2.3.3.1 游标变量(REF CURSOR)
2.3.3.1.1 静态游标:

使用显示游标时,需要在定义显示游标是指定相应的select语句。

2.3.3.1.2 动态游标:

使用显示游标时,在定义时不指定相应的select语句,而是在打开游标时指定select语句。

2.3.3.1.3 示例:
  1. DECLARE  
  2. TYPE c1  
  3. IS  
  4.   REF  
  5.   CURSOR;  
  6.     emp_cursor c1;  
  7.     v_name customer.name%TYPE;  
  8.     v_sal customer.money%TYPE;  
  9.   BEGIN  
  10.     OPEN emp_cursor for select name, money from customer ;  
  11.     LOOP  
  12.       FETCH emp_cursor INTO v_name,v_sal;  
  13.     EXIT  
  14.   WHEN emp_cursor%NOTFOUND;  
  15.     dbms_output.put_line(v_name);  
  16.   END LOOP;  
  17.   CLOSE emp_cursor;  
  18. END;  
DECLARE
TYPE c1
IS
  REF
  CURSOR;
    emp_cursor c1;
    v_name customer.name%TYPE;
    v_sal customer.money%TYPE;
  BEGIN
    OPEN emp_cursor for select name, money from customer ;
    LOOP
      FETCH emp_cursor INTO v_name,v_sal;
    EXIT
  WHEN emp_cursor%NOTFOUND;
    dbms_output.put_line(v_name);
  END LOOP;
  CLOSE emp_cursor;
END;
2.3.3.2 对象对象变量(REF obj_type)

1、当编写对象类型应用是,为了共享相同对象,可以使用REF引用对象类型。

2、REF实际上是指向对象实例的指针。

2.3.3.2.1 示例:
  1. CREATE OR REPLACE TYPE home_type  
  2. AS  
  3.   OBJECT  
  4.   (  
  5.     name   varchar2(20),  
  6.     salary number(4,2) )  
  7.   CREATE TABLE homes OF home_type;  
  8.   INSERT INTO homes VALUES  
  9.     ('leeyee',20  
  10.     );  
CREATE OR REPLACE TYPE home_type
AS
  OBJECT
  (
    name   varchar2(20),
    salary number(4,2) )
  CREATE TABLE homes OF home_type;
  INSERT INTO homes VALUES
    ('leeyee',20
    );

2.3.4、LOB(Large Object)变量

用于存储大批量数据的变量

2.3.4.1 内部LOB 

包括CLOB、BLOB和NCLOB.其数据均存储在数据库中,支持事务。其中BLOB用于存储大批量二进制数据,而CLOB/NCLOB用于存储大批量字符数据。

2.3.4.2 外部LOB

只有BFILE,该类型数据存储在OS文件中,不支持事务操作。BFILE则存储指向OS文件的指针。

2.4、PL/SQL基础其他

2.4.1、分隔符

2.4.1.1.单符号分隔符

+ 加法

% 属性提示符

'       字符串分隔符

. 组件分隔符

/       除法操作符

( 表达式或列表分隔符

) 表达式或列表分隔符

: 非PL/SQL变量提示符

, 项分隔符(表名、列名等分隔符)

* 乘法

" 双引号变量分隔符

2.4.1.2.组合分隔符

= 等号

< 小于

> 大于

@ 远程数据库访问操作符

; 语句中止符

- 减法或负数

2.4.1.3.组合分隔符

:= 赋值

=> 关联操作符

|| 连接操作符

** 幂操作符

<< 标号开始分隔符

>> 标号开始分隔符

/* 多行注释开始分隔符

*/      多行注释结束分隔符

.. 范围操作符

<> 不等操作符

!= 不等操作符

^= 不等操作符

<= 小于等于

>= 大于等于

-- 当行注释

2.5、PL/SQL建议编码规则

2.5.1、命名规则

1.定义变量,建议使用v_作前缀:v_job

2.定义常量,建议使用c_作签注:c_rate

3.定义游标,建议使用_cursor作后缀:emp_cursor

4.定义例外,建议使用e_作前缀:e_integrity_error

5.定义PL/SQL表示,建议使用_table_type作后缀:sal_table_type

6.定义PL/SQL表变量时,建议使用_table作后缀:sal_table

7.定义PL/SQL记录类型时,建议使用_record_type作后缀:emp_record_type

8.定义PL/SQL记录变量时,建议使用_record作后缀:emp_record

2.5.2、大小写规则

1.SQL关键字大写:SELECT\UPDATE\SET\WHERE etc.

2.PL/SQL关键字大写:DECLARE\BEGIN\END etc.

3.数据库类型大写:INT\VARCHAR2\DATE etc.

4.数据库类对象和列小写:emp\sal\ename etc.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值