1. 程式人生 > >學習筆記day66-----oracle-qlsql中對oracle資料庫的操作的模組化

學習筆記day66-----oracle-qlsql中對oracle資料庫的操作的模組化

PLSQL
1、資料庫訪問相關的技術
    1)  plsql       procedural  過程化sql
    2)  proc/c++    在c/c++語言中嵌入sql語句實現對oracle資料庫訪問的技術
    3)  odbc/ado    vc中訪問資料庫的技術
    4)  oci         oracle底層提供的連線介面
    5)  jbdc        java訪問資料庫的技術
2、PLSQL
    2.1、概念
        plsql(procedural language/sql) 是在標準sql的基礎上增加了過程化的處理的語言。
        Oracle客戶端工具訪問oracle伺服器的操作語句
        Oracle對SQL的擴充。
    2.2
、特點 結構化模組化程式設計 良好的可移植性,良好的可維護性 提升系統性能 不便於向異構資料庫移植 3、SQL語言的特點 機器語言 彙編 高階語言 結構化語言 只管做什麼,不管怎麼做 沒有過程和控制語句 沒有演算法描述能力 4、QL/SQL擴充了 1) 增加了變數和資料型別 2) 流程控制語句 3) 過程和函式 4) 物件型別和方法 5、plsql程式的結構 declare /*宣告區 宣告變數、定義型別等*/ /*沒有宣告定義的內容,宣告區可以省略*/
-- 單行註釋 begin /*執行區 執行sql或plsql語句*/ exception /*異常處理區 程式出錯後進行處理的區域*/ /*可以省略*/ end; 6、plsql的開發環境 sqlplus 命令列下的工具 plsql developer 視覺化的工具 begin dbms_output.put_line('Hello World!'); end; / --必須獨立佔一行 set serveroutput on //開啟sqlplus的輸出 7
、識別符號 7.1、作用 給變數、資料型別、遊標、異常、過程、函式、包、觸發器等命名。 7.2、使用變數 declare 變數名 型別; 變數名 型別:=值; --賦值 ':=' begin 變數名:=值; declare var_id number; var_name varchar(20); begin var_id:=1; var_name:='test'; dbms_output.put_line(var_id||','||var_name); end; / 8、變數和資料型別 8.1、資料型別 1) 標量型別 number binary_integer char varchar2 date boolean 2) 複合型別 record table 3) 參考型別 ref cursor 4) 大型別 (一般儲存大資料的檔案路徑) BLOB 0~4g CLOB 0~4g BFILE 8.2、變數的修飾符 變數名 constant 型別 變數名 資料型別 not null declare --var_id constant number;constant修飾的變數必須初始化 var_id constant number:=1; var_name varchar(25) not null; begin --var_id:=1;constant修飾的變數不能被賦值 varchar:='test'; dbms_output.put_line(var_id); end; / declare --var_id constant number; var_id constant number:=1; --var_name varchar2(25) not null; var_name varchar2(25) not null:='test'; begin --var_id:=1; var_name:='test'; dbms_output.put_line(var_id); end; / 任何變數在初始化之前都是null 8.3、使用binary_integer和boolean宣告變數 boolean true false null declare var_id binary_integer:=1; var_f boolean; begin var_f:=true; if var_f then dbms_output.put_line(var_id); end if; end; / 8.4、宣告兩個變數,型別分別和s_emp中id和first_name型別相同,吧id=1的員工的id和first_name儲存著這兩個變數中,並輸出。 declare var_id s_emp.id%type; var_name s_emp.first_name%type; begin select id,first_name into var_id,var_name from s_emp where id=1; dbms_output.put_line(var_id||','||var_name); end; / 獲取表中欄位的型別:表名.欄位%type 獲取表中欄位的值給變數賦值: select 欄位列表 into 變數列表 from 表名 where 條件; 要求有且只有一行結果 8.5record型別 相當於c語言中的結構體 8.5.1、定義record型別 type 型別名 is record( 欄位1 型別, ... 欄位2 型別 ); 8.5.2、定義record型別,成員分別和s_emp中id,first_name和salary的型別一致,宣告該型別變數,接受制定編號的員工的資訊並輸出。 declare type record_emp is record(id s_emp.id%type, name s_emp.first_name%type, salary s_emp.salary%type); var_emp record_emp; begin select id,first_name,salary into var_emp from s_emp where id=1; dbms_output.put_line(var_emp.id||','||var_emp.name||','||var_emp.salary); end; / 8.6、使用 表名%rowtype 變數 相當於將這張表中的所有欄位的型別都作為一個特殊型別,且欄位型別,順序和表一致。 declare var_emp s_emp%rowtype; begin select * into var_emp from s_emp where id=1; dbms_output.put_line(var_emp.salary); end; / 8.7、table型別 類似於c語言中的陣列 8.7.1、定義table型別的語法 type 型別名稱 is table of 元素的資料型別 index by binary_integer; 8.7.2、定義一個table型別,宣告變數用來儲存多個數字 declare type table_number is table of number index by binary_integer; vars_num table_number; begin vars_num(1):=1; end; / 8.7.3、下標連續,遍歷table型別的變數 declare type table_number is table of number index by binary_integer; vars_num table_number; var_i number; begin vars_num(1):=100; vars_num(7):=200; vars_num(3):=300; var_i:=1; end; / 下標不連續,便利table型別的變數 迭代器思想 first():獲取第一個元素的鍵 last():獲取最後一個元素的鍵 next(n):獲取鍵為n的元素的下一個元素 declare type table_number is table of number index by binary_integer; vars_num table_number; var_i number; begin vars_num(1):=100; vars_num(7):=200; vars_num(3):=300; var_i:=vars_num.first; var_i:=vars_num.next(var_i); end; 8.7.4、定義一個table型別,宣告變數儲存s_emp表中id為1,3,7的員工的資訊,並輸出 declare type table_emp is table of s_emp%rowtype index by binary_integer; vars_emp table_emp; var_i binary_integer; begin select * into vars_emp(1) from s_emp where id=1; select * into vars_emp(3) from s_emp where id=3; select * into vars_emp(7) from s_emp where id=7; var_i:=vars_emp.first(); dbms_output.put_line(vars_emp(var_i).first_name||','||vars_emp(var_i).salary); var_i:=vars_emp.next(var_i); dbms_output.put_line(vars_emp(var_i).first_name||','||vars_emp(var_i).salary); var_i:=vars_emp.next(var_i); dbms_output.put_line(vars_emp(var_i).first_name||','||vars_emp(var_i).salary); end; / 8.8、變數的作用域 plsql程式碼塊的巢狀 declare var_m number:=100; begin declare var_n number:=10; begin /*區域性是可以訪問全域性變數的*/ dbms_output.put_line(var_m); dbms_output.put_line(var_n); end; dbms_output.put_line(var_m); /*全域性不可以訪問區域性變數的*/ dbms_output.put_line(var_n); end; -- 在區域性訪問同名的全域性變數,可以使用標籤 -- 定義標籤: <<標籤名>> -- 使用標籤: 標籤名.變數名 <<global>> declare var_n number:=100; begin declare var_n number:=10; begin /*區域性會隱藏同名全域性變數*/ dbms_output.put_line(var_n); dbms_output.put_line(global.var_n); end; end; / 9、控制語句 9.1、分支語句 9.1.1、簡單if if 條件 then 操作; end if; 9.1.2if...else if 條件 then 操作1 else 操作2 end if; 9.1.3、多分支if if 條件1 then 操作1 elsif 條件2 then 操作2 ... [else 操作n] end if; 9.1.4、定義三個變數,並賦值,輸出最大值。 declare num1 number:=1; num2 number:=2; num3 number:=3; begin if num1>num2 then if num1>num3 then dbms_output.put_line(num1); else dbms_output.put_line(num2); end if; else if num2>num3 then dbms_output.put_line(num2); else dbms_output.put_line(num3); end if; end if; end; / 9.1.5NULL值的運算特點 declare var_a number; var_b number; begin if var_a>var_b then dbms_output.put_line('var_a>var_b'); elsif var_a<var_b then dbms_output.put_line('var_a<var_b'); elsif var_a=var_b then dbms_output.put_line('var_a=var_b'); end if; end; / 空值參與的邏輯運算,其結果為假 9.2、迴圈語句 迴圈變數的初始化 迴圈條件 迴圈操作 迴圈條件的更新 9.2.1、簡單迴圈 1)語法 loop 迴圈操作; end loop; 2) 退出迴圈的方式 第一種: if 退出迴圈的條件 then exit; end if; 第二種: exit when 退出迴圈的條件; 3) 使用簡單迴圈 輸出1-10 declare var_i number:=1; begin loop dbms_output.put_line(var_i); if var_i=10 then exit; end if; var_i:=var_i+1; end loop; end; / 9.2.2while迴圈 1) 語法 while 條件 loop 迴圈操作 end loop; 2) 輸出1-10 declare var_i number:=1; begin while var_i<=10 loop dbms_output.put_line(var_i); var_i:=var_i+1; end loop; end; / 9.2.3for迴圈 1) 語法 for 變數 in 區間 loop 迴圈操作 end loop; 2) 輸出1-10 begin for var_i in 1..10 loop dbms_output.put_line(var_i); end loop; end; / a.for迴圈的迴圈變數不需要宣告和初始化 b.(var_i)迴圈變數不允許賦值 3) 逆序 begin for var_i in reverse 1..10 loop dbms_output.put_line(var_i); end loop; end; 9.3、goto語句 9.3.1 語法 <<標籤名>> --必須有語句 NULL;--空語句 goto 標籤名; 9.3.2、使用goto退出多層迴圈 begin for i in 1..3 loop for j in 1..5 loop dbms_output.put_line(j); if(j=3) then goto outer; end if; end loop; end loop; <<outer>> NULL; end; / 9.3.3、使用exit退出多層迴圈 begin <<outer>> for i in 1..3 loop for j in 1..5 loop dbms_output.put_line(j); if(j=3) then exit outer; end if; end loop; end loop; end; / 10、PLSQL使用Sql語句 1)selcet語句(dql) 配合into使用 select 欄位列表 into 變數列表 from 表名 where 條件; 2)dml語句(insert update delete) tcl語句(commit rollback savepoint) 可以直接在plsql中使用 3)ddl語句(create drop alter) 不能直接在plsql中使用 需要使用動態sql 11、動態sql 11.1、概念 把一條sql語句儲存在字串變數中,執行時把字串變數的過程sql去執行 11.2、ddl語句的動態sql declare sqlstr varchar2(100); begin sqlstr:='create table testdsql_lx_42(id number)'; execute immediate (substr(sqlstr,1,length(sqlstr)-1) || ',name varchar2(25))'); end; / 11.3、dml語句的動態sql 1) 在plsql中直接使用dml和tcl語句 begin insert into testdsql_lx_42 values(1,'test1'); commit; end; / 2) 常規字串拼接 declare sqlstr varchar2(100); begin sqlstr:='insert into testdsql_lx_42 values(2,''test2'')'; execute immediate sqlstr; commit; end; / 3) 帶變數的字串的拼接 declare sqlstr varchar2(100); var_id number:=3; var_name varchar2(25):='test3'; begin sqlstr:='insert into testdsql_lx_42 values(' || var_id || ',' || '''' || var_name || ''')'; execute immediate sqlstr; end; 4) 使用佔位符 配合using 實現字串拼接 declare sqlstr varchar2(100); var_id number:=4; var_name varchar2(25):='test3'; begin sqlstr:='insert into testdsql_lx_42 values(:b0,:b1)'; execute immediate sqlstr using var_id,var_name; end; ------------------- 1、定義table型別,宣告變數儲存s_dept中編號為31.41.45的部門的資訊,並迴圈輸出 2、使用動態sql 刪除testdsql_lx_42中指定的id的資料行 declare type table_dept is table of s_dept%rowtype index by binary_integer; vars_dept table_dept; begin select * into vars_dept(1) from s_dept where id=31; select * into vars_dept(2) from s_dept where id=14; select * into vars_dept(3) from s_dept where id=45; for var_i in 1..3 loop bdms_output.put_line(vars_dept(var_i)); end loop; end; / declare id number:=1; sqlstr varchar(100); begin sqlstr:='delete table testdsql_lx_42 where id=:d'; execute immediate sqlstr using id; end; / insert into 表名[(欄位列表)] values(值列表); update 表名 set 欄位=新值[,欄位=新值,...] [where 子句]; delete [from] 表名 [where 子句];