/*
達內學習 Oracle day41 2013-10-30
*/
常見的訪問oracle的技術
1.prosql 過程化SQL
2.proc/c++ 使用C語言或者C++反問Oracle數據庫
3.odbc /ADO VC中訪問數據庫的技術
4.JDBC/SQLJ JAVA訪問數據庫技術
5.OCI oracle底層連接接口
PL/SQL(procedural language/Sql)是在標準SQL的基礎上增加了過程化處理的語言
oracle客戶端工具訪問oracle的操作語言
oracle對sql的擴充
plsql擴展了sql
變量和數據類型、控制語句(if 、for、go)、過程(procedure)和函數(function)、對象和方法 。
plsql的程序結構:
declare
/*申明區:*/
begin
/*執行區*/
exception
/*異常處理區*/
end;
--------------------------------
c語言的定義和申明
int a;//定義
extern int a;//申明 外部變量
--------------------------------
申明區:用來定義變量 或者 類型。 (不區分定義和申明)
執行區:用來執行sql語句或者plsql語句
異常處理區:當sql語句出錯以後 自動轉到異常處理區 做錯誤處理
圖形界面:sqldeveloper
begin
dbms_output.put_line('hello plsql!');
end;
打開輸出:
set serveroutput on
------------------------------------------
變量的定義:
1,一定要在申明區
變量名 類型;
2,舉例
declare
var_id number:=111;
var_name varchar2(30):='wocao';
begin
dbms_output.put_line(var_id||':'||var_name);
var_id := 1234;
var_name := 'wozaicao';
dbms_output.put_line(var_id||'@'||var_name);
end;
3,變量的修飾
變量名 constant 類型;
變量名 類型 not null;
var_id constant number:=111; --不允許修改
var_name varchar2(30) not null:='wocao'; --必須初始化
4,變量的數據類型
標量類型:
number(數字)、binary_integer(二進制整數)、char(定長字符串)
varchar2(變長字符串)、date(日期類型)、boolean(布爾類型 true false null)
複合類型:
record(記錄 對應結構)
table (表類型)
參考類型
ref 參考類型
ref cursor 參考遊標
大類型:
blob 大二進制 0-4g
clog 大字符類型 0-4g
bfile 文件類型 0-4g
declare
flag boolean := true;
jobno binary_integer :=123;
begin
if flag then
dbms_output.put_line(jobno);
end if;
end;
-------------------------------------------------
5,取得表中字段對應的類型
表名.字段名%type 取得對應的類型
定義兩個變量 分別和s_emp 表中的 id 和first_name 的類型相同 然後把id = 1的first_name 賦值給定義的變量
declare
myid s_emp.id%type :=1; /*通過%type定義類型*/
myname s_emp.first_name%type;
begin /*通過select into語句賦值*/
select first_name into myname from s_emp where id = myid;
dbms_output.put_line(myid||' '||myname);
end;
declare
myid s_emp.id%type := 3;
myname s_emp.first_name%type;
mysalary s_emp.salary%type ;
begin
select id,first_name,salary into myid,myname,mysalary from s_emp where id = 3;
dbms_output.put_line(myid||myname||mysalary);
end;
6,類似於C語言結構體的類型
record 類型
定義record類型
type record_name is record (
字段名 類型,
字段名 類型
);
變量名 記錄類型的名字;
declare
type myrecord is record(/*定義記錄*/
myid s_emp.id%type,
myname s_emp.first_name%type,
mysalary s_emp.salary%type
);
my3 myrecord; /*定義記錄變量*/
my2 myrecord;
begin
select id,first_name,salary into my3 from s_emp where id = 3;
dbms_output.put_line(my3.myid||' '||my3.myname||' '||my3.mysalary);
/*記錄類型之間的賦值*/
my2:= my3;/*字符串賦值 my2.name = my3.name */
end;
----------------------------------
把s_emp 表中id =1的所有數據記錄在變量中
s_emp%rowtype
s_dept%rowtype
/* 使用表的一行的類型 定義一個變量 */
declare
var_emp s_emp%rowtype;
begin
select * into var_emp from s_emp where id = 1;
dbms_output.put_line(var_emp.id||':'||var_emp.first_name||':'||var_emp.salary);
end;
/*把id= 50的部門信息仿如一個rowtype類型的變量中並輸出*/
declare
type var_dept s_dept%rowtype;
begin
select * into var_dept from s_dept where id = 50 ;
dbms_output.put_line(var_dept.id||var_dept.name||var_dept.region_id);
end;
--------------------------------------------------------------------------
8,table 類型
相當於c中的數組類型
定義 table 類型
type table_name is table of 表中的數據類型 index by binary_integer;
declare
/*定義表類型*/
type numstype is table of number index by binary_integer;
/*使用類型定義變量*/
var_nums numstype;
/*定義一個下標變量*/
var_ind binary_integer;
begin
--向table類型變量中放入數據
var_nums(-1):= 234;
var_nums(1):= 23;
var_ind :=var_nums.first();
dbms_output.put_line(var_nums(var_ind));
var_ind :=var_nums.next(var_ind);
dbms_output.put_line(var_nums(var_ind));
end;
/*迭代器思想 根據一個元素的信息 可以得到下一個元素的信息*/
first()可以返回第一個元素對於的下標
next(n) 根據一個元素的下標得到下一個元素的下標
last()得到最後一個元素對應的下標
把s_emp表中idd=1 或 id= 5 或 id= 11 的所有數據放入一個table類型的變量中,然後用迭代器打印 id first_name salary
---- 老師寫的
declare
type empstype is table of s_emp%rowtype index by binary_integer;
var_emps empstype;
var_ind binary_integer:=1;
begin
select * into var_emps(var_ind) from s_emp where id=var_ind;
var_ind:=5;
select * into var_emps(var_ind) from s_emp where id=var_ind;
var_ind:=11;
select * into var_emps(var_ind) from s_emp where id=var_ind;
var_ind:=var_emps.first();
dbms_output.put_line(var_emps(var_ind).id||':'||var_emps(var_ind).salary);
var_ind:=var_emps.next(var_ind);
dbms_output.put_line(var_emps(var_ind).id||':'||var_emps(var_ind).salary);
var_ind:=var_emps.last();
dbms_output.put_line(var_emps(var_ind).id||':'||var_emps(var_ind).salary);
end;
----
------------------------------------------------------------
變量的作用域 和 可見行
plsql塊 嵌套
<<abc>> --標籤
declare
var_m number:= 1;
begin
declare
var_n number:=100;
begin
/*
局部 可以訪問全局 局部優先
*/
end;
/* 全局不能訪問局部*/
end;
---------------------------------------------------------
plsql中的控制語句
1,分支語句
if a<b then
-- 中間代碼
end if;
if a<b then
else
end if;
if a<b then
elsif a<c then
elsif a<d then
end if;
if a<b then
elsif a<c then
elsif a<d then
else
end if;
----------------------------------------------------------
循環
a,簡單循環
loop
……循環條件
end loop;
終止循環:exit when 條件;
if 條件 then exit;
b,while 循環
while 循環條件 loop
……循環語句
end loop;
declare
i number :=1;
begin
while i<11 loop
dbms_output.put_line(i);
i:=i+1;
end loop;
end;
c,for 循環 ------智能循環
for 變量 in 區間 loop
/* 循環語句 */
end loop;
整數區間1..10 1到10
begin
for i in 1..10 loop
dbms_output.put_line(i);
end loop;
end;
begin
for i in reverse 1..10 loop
dbms_output.put_line(i);
exit when i=5;
end loop;
end;
for循環中的變量不能被修改
-----------------------------------------------------
多重循環的退出
declar
var_m number;
var_n number;
begin
while var_m < 4 loop
end loop;
end;
有一個人他有一個小狗,有一天他突然想養一隻小貓,小狗就是不同意,但是他就是非要想養一隻小貓,小狗就是不同意,那腫麼辦呢?於是他就和小狗商量說,咱家再養一隻小狗好不好,小狗非常開心,因爲他每天那麼寂寞其實早就想有一個小夥伴了,晚上的時候小狗很高興很高興,一晚上都沒有睡覺,第二天早晨的時候,主人告訴小狗說咱家要不不養小狗了好嗎?小狗當然很失望,很生氣,很不願意,主人趁機說,養小狗可以那養小貓爲什麼不可以啊,要不這樣吧,養一隻小狗也養一隻小貓好不好,小狗太孤獨了只好答應了,雖然它不想多一隻小貓,可是最起碼也多了一隻小狗啊。後來公主和王子過上了幸福的生活。