博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PL/SQL数据类型
阅读量:7040 次
发布时间:2019-06-28

本文共 3367 字,大约阅读时间需要 11 分钟。

1、变量和常量

变量语法: variable_name data_type [[NOT NULL] [:=VALUE]]
    说明:NOT NULL对变量定义非空约束,必须为变量赋非空的初始值,并且不允许在任何时候将其值修改为NULL。

--变量样例:

1
2
3
4
5
6
7
8
SQL>SERVEROUT 
ON
SQL>
DECLARE
  
v_num NUMBER(4);
 
BEGIN
  
v_num:=20;
  
DBMS_OUTPUT.PUT_LINE(
'变量名v_num的值为:'
||v_num);
 
END
;
 
/

常量语法: constant_name CONSTANT data_type [:=VALUE]

--常量样例:

1
2
3
4
5
DECLARE
  
c_num CONSTANT NUMBER(4):=100;
BEGIN  
  
DBMS_OUTPUT.PUT_LINE(
'常量名c_num的值为:'
||c_num);
END
;

 

2、复合数据类型

2.1 %TYPE类型

    引用某个变量或者数据库的列的类型作为某变量的数据类型。

1
2
3
4
5
6
7
8
9
10
SET 
SERVEROUT 
ON
DECLARE
    
v_ename scott.emp.ename%TYPE;
    
v_sal1 number(11);
    
v_sal2 v_sal1%TYPE;
BEGIN
    
SELECT 
ename,sal 
INTO 
v_ename,v_sal1 
FROM 
scott.emp 
WHERE 
empno=7369;
    
v_sal2:=v_sal1;
    
DBMS_OUTPUT.PUT_LINE(v_ename||
'的工资是'
||v_sal2);
END
;

2.2 %ROWTYPE

    引用数据库表中的一行作为数据类型,即RECORD类型(记录类型),是PL/SQL的附加类型。表示一条记录,相当于JAVA中的对象。可以使用“.”来访问记录中的属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
DECLARE
 
    
v_emp scott.emp%ROWTYPE;     
 
BEGIN
 
    
SELECT 
INTO 
v_emp 
FROM 
scott.emp 
WHERE 
empno=7654;     
 
    
DBMS_OUTPUT.PUT_LINE(
'姓名:'
||v_emp.ename);
 
    
DBMS_OUTPUT.PUT_LINE(
'部门编号:'
||v_emp.deptno);
 
END
;

 

2.3 记录类型

语法:TYPE record_type IS RECORD(

                 field1_name data_type_and_size [NOT NULL][:=default_value],
                 ...
                 fieldn_name data_type_and_size [NOT NULL][:=default_value]
            );

    将逻辑相关的数据作为一个单元存储起来,使用TYPE关键字来定义,是显示记录类型,使用%ROWTYPE是隐式记录类型。

--样例一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DECLARE
 
 
TYPE emp_record_type 
IS 
RECORD(
 
      
ename VARCHAR2(10),
 
      
deptno NUMBER(2)
 
 
);    
 
     
emp_record emp_record_type;     
 
BEGIN    
 
     
SELECT 
ename,deptno 
INTO 
emp_record 
FROM 
scott.emp 
WHERE 
empno=7654;         
 
     
DBMS_OUTPUT.PUT_LINE(
'姓名:'
||emp_record.ename);    
 
     
DBMS_OUTPUT.PUT_LINE(
'部门编号:'
||emp_record.deptno);
 
END
;

 --样例二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DECLARE
 
  
TYPE emp_record_type 
IS 
RECORD(
 
       
name 
scott.emp.ename%TYPE,
 
       
salary scott.emp.sal%TYPE,
 
       
deptno scott.emp.deptno%TYPE
 
  
);
 
  
emp_record emp_record_type;
 
BEGIN 
 
  
select 
ename,sal,deptno 
into 
emp_record 
from 
scott.emp 
where 
empno=&
no
;       
 
  
DBMS_OUTPUT.PUT_LINE(
'姓名:'
||emp_record.
name
);    
 
  
DBMS_OUTPUT.PUT_LINE(
'部门编号:'
||emp_record.deptno);
 
END
;

或:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DECLARE
 
  
TYPE emp_record_type 
IS 
RECORD(
 
       
name 
scott.emp.ename%TYPE,
 
       
salary scott.emp.sal%TYPE,
 
       
deptno scott.emp.deptno%TYPE
 
  
);
 
  
emp_record emp_record_type;
 
BEGIN
 
        
select 
ename,sal,deptno 
into 
emp_record.
name
,emp_record.salary,emp_record.deptno 
from 
scott.emp 
where 
empno=&
no
;
 
        
DBMS_OUTPUT.PUT_LINE(
'姓名:'
||emp_record.
name
);    
 
        
DBMS_OUTPUT.PUT_LINE(
'部门编号:'
||emp_record.deptno);
 
END
;

 --样例三:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
--检索数据
DECLARE
        
dept_record scott.dept%ROWTYPE;
BEGIN
        
dept_record.deptno:=1;
        
dept_record.dname:=
'administrator'
;
        
dept_record.loc:=
'NC'
;
        
insert 
into 
scott.dept 
values 
dept_record;
END
;
--插入数据
DECLARE
        
dept_record scott.dept%ROWTYPE;
BEGIN
        
dept_record.deptno:=2;
        
dept_record.dname:=
'administrator'
;
        
insert 
into 
scott.dept(deptno,dname) 
values
(dept_record.deptno,dept_record.dname);
END
--更新数据
DECLARE
        
dept_record scott.dept%ROWTYPE;
BEGIN
        
dept_record.deptno:=1;
        
dept_record.dname:=
'HZY'
;
        
update 
scott.dept 
set 
row=dept_record 
where 
deptno=dept_record.deptno;
END
;
--删除数据
DECLARE
        
dept_record scott.dept%ROWTYPE;
BEGIN
        
dept_record.deptno:=1;
        
delete 
from 
scott.dept 
where 
deptno=dept_record.deptno;
END
;

      

 

 

 

 

 

      本文转自stock0991 51CTO博客,原文链接:http://blog.51cto.com/qing0991/1597195,如需转载请自行联系原作者

 

 

 

你可能感兴趣的文章
【跨域】跨域的简易实现和测试
查看>>
获得字符串包含↵,渲染到页面不换行的解决办法
查看>>
北哥这篇文讲解yii2权限扩展(yii2-admin) - 下部
查看>>
微信web开发遇到的坑
查看>>
写了一个数字转成简 / 繁体汉字的助手函数
查看>>
vue配合iview/element等ui实现界面效果起步
查看>>
仿饿了么项目-vue的学习笔记总目录
查看>>
Angular 2.x+ 如何动态装载组件
查看>>
React中的setTimeout、setInterval的注意事项
查看>>
如何深入使用scss开发一个简单页面
查看>>
JS学习系列 03 - 函数作用域和块作用域
查看>>
外卖订单爬虫(美团,饿了么,百度外卖)
查看>>
用Flink取代Spark Streaming,知乎实时数仓架构演进
查看>>
2019年值得关注的八大DevOps趋势
查看>>
教育部下令中小学推广编程教育,全民AI真的要来了
查看>>
C#未来新特性:静态委托和函数指针
查看>>
从Python2到Python3:超百万行代码迁移实践
查看>>
如何避免移动测试自动化失败
查看>>
Real World Kanban作者访谈
查看>>
Confluent平台5.0支持LDAP授权及用于IoT集成的MQTT代理
查看>>