學習筆記day66-----oracle-qlsql中對oracle資料庫的操作的模組化
阿新 • • 發佈:2019-02-04
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.5、record型別 相當於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.2、if...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.5、NULL值的運算特點
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.2、while迴圈
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.3、for迴圈
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 子句];