PL/SQL中的變量
1)、聲明
--變量名 類型 :=初始值 v_str varchar2(10):='abc';
注意:變量必須在declare語句塊中聲明。
2)、簡單類型
- number:數字
- varchar2:變長字符串
- boolean: 不能輸出 true false null
- date: 日期 to_date to_char
- char:定長字符串
- binary_integer: 計數整數
- long:2G字符串
3)、標識符規則
a、第一個字符必須是字母(v_)
b、變量名最多包含30個字符
c、不要與數據庫的表或者列同名
d、每一行只能聲明一個變量
e、變量名不能夠使用保留字,如 from、select 等
4)、賦值 :=
I、字符類型必須使用單引號;
II、不可以使用group by;
III、可以使用數學操作符或字符串連接操作符。
5)&
接收客戶端的輸入 。 爲佔位符
6)、實例
declare
--聲明一個字符串
v_str varchar2(20) :='shsxt';
--聲明一個整數
v_num number(5) :=10;
--聲明一個日期
v_date date :=sysdate;
v_date2 date :=to_date('2017-3-9','yyyy-MM-dd');
--聲明一個布爾
v_flag boolean :=null;
begin
--拼接字符串
dbms_output.put_line(v_str||'-->'||v_num||'-->'||to_char(v_date2,'yyyy-MM-dd'));
--不能輸出布爾
end;
輸出結果:
shsxt–>10–>2017-03-09
二、複雜類型
1)、%type :字段類型
獲取與指定的字段一致類型,
如 v_empno emp.empno%type;
v_empno2 v_empno%type;
等同於:
v_empno number(4);
2)、%rowtype:行類型
與表結構完全一致,如 v_dept dept%rowtype
實例
/**
數據類型
1、%type -->字段類型
2、%rowtype -->記錄類型
*/
declare
--定義字符串 存儲 ename的值
v_ename varchar2(20) :='smith';
--不用關注字段的類型 與長度 (簡化)
v_name emp.ename%type :='sss';
--存儲一條記錄(存在很多 字段)
v_emp emp%rowtype ;
begin
v_emp.empno :=100;
v_emp.sal :=9999;
dbms_output.put_line('僱員名爲:'||v_name||'編號爲:'||v_emp.empno||'工資'||v_emp.sal);
end;
3)、table (類似於js數組)
a)、創建類型
集中存放: type 自定義的類型名 is table of 數據類型
散列存放: type 自定義的類型名 is table of 數據類型 index by binary_integer
b)、聲明變量
集中存放: 變量名 自定義的類型名:= 自定義的類型名(值列表);
散列存放: 變量名 自定義的類型名
實例
(1).散列
declare
--1、創建類型
type t_table is table of dept.dname%type index by binary_integer;
--2、聲明變量
v_table t_table;
begin
--3、使用變量
v_table(-1) :='shsxt';
v_table(5) :='bjsxt';
--v_table('a') :='bjsxt2';
dbms_output.put_line( v_table(5)||'-->'|| v_table(-1));
end;
(2).集中
declare
--集中存儲
--定義類型
type t_table_deptno is table of dept.deptno%type;
type t_table_empno is table of emp.empno%type;
--聲明變量
v_deptno t_table_deptno:=t_table_deptno(20,30,40);
v_empno t_table_empno :=t_table_empno();
begin
--使用變量
dbms_output.put_line(v_deptno(1));
--訪問第四個元素
v_deptno.extend;
v_deptno(4):=50;
--v_empno.extend;
--v_empno(1):=7898;
dbms_output.put_line(v_empno(1));
end;
4)、record(結構體)
類似於結構體,由多個不同類型組合而成複雜類型,與 table 相同“先創建結構體後定 義聲明變量”。
a)、先創建類型
type 類型名 is record(
字段名1 類型1,
字段名2 類型2,
…..
);
b)、再聲明變量
變量名 類型名;
實例:
declare
--創建類型
type t_rec is record(
empno number(5),
ename varchar2(20),
dname dept.dname%type
);
--聲明變量
v_rec t_rec;
begin
--使用變量
v_rec.empno :=1000;
v_rec.ename :='xshuaiwen';
v_rec.dname :='上海';
dbms_output.put_line(v_rec.dname||'-->'||v_rec.ename);
end;
5)、遊標
遊標指向結果集的 指針,通過遊標 遍歷操作結果集
1)、分類
- a.隱式遊標(dml語句中)
- b.顯式遊標(靜態遊標、ref遊標)
2)、標準步驟
1)、創建遊標
(2)、聲明遊標
(3)、打開遊標
(4)、使用遊標
(5)、關閉遊標
3)、四個屬性
%rowcount :記錄數
%isopen :是否打開
%found: 存在記錄
%notfound:沒有記錄
4)、實例
declare
--1、創建並聲明遊標(靜態遊標)
cursor cur_emp is select * from emp where sal>3000 order by sal desc;
v_emp emp%rowtype;
begin
--3、打開遊標
open cur_emp;
--4、使用遊標 (獲取數據)
fetch cur_emp into v_emp;
dbms_output.put_line(v_emp.empno||'-->'||v_emp.ename||'-->'||v_emp.sal);
--5、關閉遊標
close cur_emp;
exception
when no_data_found then
dbms_output.put_line('數據未找到'||sqlcode||'-->'||sqlerrm);
when too_many_rows then
dbms_output.put_line('數據超出'||sqlcode||'-->'||sqlerrm);
when others then
dbms_output.put_line('其他異常'||sqlcode||'-->'||sqlerrm);
end;
後續遊標請看下一篇—————————>>>>>>>>>>