1,常見的操作數據庫的技術有那些
jdbc 使用java 訪問數據庫的技術
PLSQL (procedure 過程化sql) 在數據庫內部操作數據的技術
proc/c++ c 和 c++ 訪問數據庫的技術
ODBC 微軟提供訪問數據庫的技術
OCI oracle 底層的連接接口
2,Oracle中的復合數據類型
Oracle中的復合數據類型record,table,cursor
2.1 record類型
2.1.1 語法
/*定義一個record類型*/ type record類型名稱 is record( 屬性 數據類型, 屬性 數據類型 ... ); /*使用record類型名稱定義一個record變量*/ record變量名 record類型名稱
也可以使用表的字段來定義,
/*使用表的字段類型定義一個record類型*/ type record類型名稱 is record( 屬性 表名.屬性名%type, 屬性 表名.屬性名%type ... ); /*使用record類型名稱定義一個record變量*/ record變量名 record類型名稱
2.1.2 示例
使用record類型存儲來存儲不同類型的數據:
set serveroutput on; declare type emptype is record( id number, name varchar2(5) ); var_emp emptype; begin var_emp.id:=1; var_emp.name:='jame'; dbms_output.put_line(var_emp.id); end; /
2.2 table類型
2.2.1 語法
/*定義一個table類型*/ type table類型名 is table of 元素類型名 index by binary_integer; /*定義一個table變量*/ 變量名 table類型名;
訪問數據的方式,
table變量(下標):=值;
2.2.2 示例
使用表格存儲同一種類型的數據:
declare type numstype is table of number index by binary_integer; var_nums numstype; begin var_nums(0):=9; var_nums(1):=5; var_nums(2):=2; var_nums(3):=7; var_nums(4):=0; dbms_output.put_line(var_nums(3));/*打印下標為3的元素*/ end;
table中的數據也可以使用迭代的思想來操作
下標不連續時 遍歷table類型的變量
迭代思想:
變量名.first() 獲取第一個元素對應的下標 (元素對應的最小下標)
變量名.next(n) 根據一個元素的下標n 得到下一個元素對應的下標
變量名.last() 獲取最后一個元素對應的下標
例如,使用迭代遍歷表中的所有數據:
set serveroutput on; declare type numstype is table of number index by binary_integer; var_nums numstype; var_index binary_integer:=0; begin var_nums(0):=9; var_nums(1):=5; var_nums(-12):=2; var_nums(3):=7; var_nums(4):=0; -- var_nums.count(); var_index := var_nums.first(); loop dbms_output.put_line(var_nums(var_index)); var_index:=var_nums.next(var_index); if var_index = var_nums.last() then dbms_output.put_line(var_nums(var_index)); exit; end if; end loop; end; /
2.3 cursor類型
2.3.1 語法
/*聲明游標*/ cursor 游標名 is select語句; /*打開游標*/ open 游標名; /*提取數據,將結果存儲到變量中,一般都是record類型*/ fetch 游標名 into 變量; /*關閉游標*/ close 游標名
2.3.2 游標的屬性
% ISOPEN 判斷游標是否打開,若打開就返回true,否則就返回false.
% ROWCOUNT 當前游標指針的偏移量.
%FOUND 如果游標提取到新數據,就返回true,否則就返回false.
%NOTFOUND 如果游標沒有提取到新數據,就返回true,否則就返回false.
2.3.3 示例
遍歷一個游標中的所有數據行:
declare /*使用s_emp創建一個游標類型*/ cursor empcursor is select id,first_name,salary from s_emp; /*使用游標創建一個record變量*/ var_emp empcursor % rowtype; begin open empcursor; loop fetch empcursor into var_emp; /* 如果沒有提取到 新數據 則結束循環 */ exit when empcursor%notfound; dbms_output.put_line(var_emp.id||':'||var_emp.first_name||':'||var_emp.salary); end loop; close empcursor; end; / /* --也可以使用如下的的for循環快速的遍歷游標中的數據 --使用for循環可以自動聲明游標變量,可以自動打開游標,可以自動提取數據,可以自動關閉游標 --在調用游標類型的時候可以傳遞參數,上面的例子可以在打開游標的時候傳入參數"open empcursor(20);" declare cursor empcursor(var_id number) is select id,first_name,salary from s_emp where id> var_id; begin FOR VAR_EMP IN empcursor(20) LOOP dbms_output.put_line(var_emp.id||':'||var_emp.first_name||':'||var_emp.salary); END LOOP; end; / */
2.3.4 參考游標 refer cursor
使用參考游標, 游標對應的sql語句,可以在程序執行的過程中發生改變 ,直到打開游標時確定對應的sql語句。
--定義一個參考游標類型 type 參考游標類型名 is ref cursor; --使用這個類型 定義一個游標變量 游標變量 參考游標類型名; --打開游標時 關聯一個動態拼接好的字符串 open 游標變量 for SQL的字符串;
例如:
根據條件動態指定查詢的數據,並且遍歷所有得到的數據行:
declare /*創建一個參考游標類型*/ type myrefcursor is ref cursor; /*創建一個參考游標變量*/ refempcursor myrefcursor; /* 為這個參考游標 定義一個動態字符串 */ sqlstr varchar2(200); var_id number:=10; type emptype is record( id s_emp.id%type, salary s_emp.salary % type, dept_id s_emp.dept_id%type ); var_emp emptype; begin sqlstr := 'select id,salary,dept_id from s_emp'; if var_id != 0 then sqlstr := sqlstr ||' where id > ' || var_id; end if; open refempcursor for sqlstr; loop fetch refempcursor into var_emp; exit when refempcursor%notfound; dbms_output.put_line(var_emp.id||':'||var_emp.salary||':'||var_emp.dept_id); end loop; close refempcursor; end; /