/******************************** 001 PL/SQL 數據類型 ****************************************/
/**
1 數據類型
2 結構
3 存儲過程
4 函數
5 游標
6 異常處理
7 觸發器
8 包
9 JAVA - ORACLE
*/
/**
1 數據類型
(1)PLSQL支持所有的SQL數據類型
(2)標量:數值、字符、布爾、日期時間
1>. number 包括(decimal、float、integer、real)
2>. oracle11g新加入一種數據類型:SIMPLE_INTEGER 范圍(-2147483648 ~ +2147483647)
數據類型不為空.對於此數據類型,ORACLE可以將這個數據類型的操作直接作用於硬件,從而提高性能。
3>. 字符型:SQL: char(長度2000)/varchar2(長度4000) PLSQL: 長度都是32767
4>. boolean (邏輯判斷 true、false、null)
v_num1 := 50;
v_num2 := 60;
v_bool := (v_num1 < v_num2);
5>. 日期時間(DATE、TIMESTAMP)
(3)LOB類型(最大可存儲4G),用於存儲大文本、圖像、視頻剪輯和聲音剪輯等非結構化數據。
BLOB(二進制對象存儲)
CLOB(大文本字符)
NCLOB(存儲UNICODE字符)
BFILE(講二進制存儲在操作系統中,只讀)
(4)復合類型
%TYPE 引用變量和數據庫列的數據類型一致
%ROWTYPE 提供表示表中一行的記錄類型
(5)對於常量 就是需要用CONSTANT關鍵字聲明並且一定要初始化值 形如: c_salary_rate CONSTANT NUMBER(7,2) := 0.25;
*/
-- 001 大對象讀取示例:(示例准備)
/**
CREATE TABLE MY_BOOK(
CHARTER_ID NUMBER,
CHARTER_TEXT CLOB
);
INSERT INTO MY_BOOK (CHARTER_ID, CHARTER_TEXT) VALUES('5','oracle11g新加入一種數據類型:SIMPLE_INTEGER 范圍(-2147483648 ~ +2147483647)
數據類型不為空.對於此數據類型,ORACLE可以將這個數據類型的操作直接作用於硬件,從而提高性能');
SELECT * FROM MY_BOOK;
-- drop table my_book;
*/
DECLARE
v_clob CLOB;
v_amount INTEGER;
v_offset INTEGER;
v_outdata VARCHAR2(1000);
BEGIN
SELECT M.CHARTER_TEXT INTO v_clob FROM MY_BOOK M WHERE M.CHARTER_ID = '5';
v_amount := 300;
v_offset := 1;
dbms_lob.read(v_clob, v_amount, v_offset, v_outdata);
dbms_output.put_line(v_outdata);
END;
-- 002 復合類型
-- %TYPE(列類型)
DECLARE
v_ename EMP.ENAME%TYPE; --與emp表中的ename類型相同
BEGIN
SELECT E.ENAME INTO v_ename FROM EMP E WHERE E.ENAME = 'SMITH';
DBMS_OUTPUT.put_line(v_ename);
END;
--%TYPE綁定某一列
DECLARE
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
v_hiredate emp.hiredate%TYPE;
BEGIN
SELECT empno, ename, hiredate INTO v_empno, v_ename, v_hiredate FROM emp WHERE empno='7369';
dbms_output.put_line('員工編號:' || v_empno);
dbms_output.put_line('員工姓名:' || v_ename);
dbms_output.put_line('入職日期:' || v_hiredate);
END;
--使用%ROWTYPE定義游標類型的變量
DECLARE
CURSOR cur_emp
IS
SELECT E.EMPNO, E.ENAME, E.JOB FROM EMP E; --使用%rowtype定義游標類型的變量
v_emprow cur_emp%ROWTYPE;
BEGIN
OPEN cur_emp;
LOOP
FETCH cur_emp INTO v_emprow;
--注意退出游標
EXIT WHEN cur_emp%NOTFOUND;
dbms_output.put_line(v_emprow.empno || ' ' || v_emprow.ename || ' ' || v_emprow.job);
END LOOP;
END;
--自定義記錄類型
/**
--定義一個記錄類型
--定義了一個my_record變量
declare
type emp_record_type is record(name emp.ename%type, salary emp.sal%type);
--定義一個my_record變量 這個變量的類型是emp_record_type
my_record emp_record_type;
*/
DECLARE
--自定義類型
TYPE emp_record_type IS RECORD(
NAME emp.ename%TYPE,
salary emp.sal%TYPE,
title emp.job%TYPE);
--變量接受自定義類型
emp_record emp_record_type;
--執行程序
BEGIN
SELECT E.ENAME, E.SAL, E.JOB INTO emp_record FROM EMP E
WHERE EMPNO = '7788';
DBMS_OUTPUT.put_line('雇員名:' || emp_record.name);
END;
-- 表類型(索引表)
/**
PL/SQL表只有倆列,一個索引列和一列(一列不代表一個字段)
通過索引列中的索引值來操作PL/SQL表中對應的用戶自定義列.
declare
--定義了一個pl/sql表類型my_table_type, 該類型是用於存放emp.ename%type
type my_table_type is table of emp.ename%type
--索引列必須是binary_integer類型的
index by binary_integer
--定義了一個my_table變量,這個變量的類型是 my_table_type
my_table my_table_type
*/
DECLARE
TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER;
ename_table ename_table_type;
BEGIN
SELECT ename INTO ename_table(1) FROM emp WHERE empno = 7788;
dbms_output.put_line(ename_table(1));
END;
