plsql(轻量版)_记录类型2
生活随笔
收集整理的這篇文章主要介紹了
plsql(轻量版)_记录类型2
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
PL/SQL這一塊,整個這一塊需要大家掌握什么,就是他基本的格式,PL/SQL,基本的語法格式,如何聲明一個變量,然后程序從哪里執行,執行的格式是什么,出現異常怎么處理,基本的語法格式,就這樣寫吧,第二個就是定義一個變量,變量賦個值,給他打印一下,這是最基本的了,然后定義多個變量,然后分別把多個變量都打印,然后你變量很多的話,把這個變量放到一個叫記錄類型里,記錄類型,就好像JAVA里面的類一樣,我把這幾個變量放在一個類中,我們講JAVA的時候講了一個類,里面有成員變量,然后創建這個類的對象,對象去調用這幾個成員變量,可以賦值,可以打印,這里面有點類似,我聲明一個記錄類型,這個類型這樣寫的,type誰誰誰,is,然后就可以寫is record,這個就是記錄類型,這個類型可以看成類似于一個函數的概念,可以給他分成多個變量,然后就分號結束,這就是一個記錄類型,逗號之間,變量聲明,JAVA里面的成員變量,記錄類型你可以看成是一個類,然后有記錄類型的一個變量,相當于他的對象,用對象去調里面的變量,你可以賦值,這叫記錄類型,記錄類型完了以后,這個相當于我們給他輸出了一個,輸出了一條語句,你只能輸出一條,一個對象對應一個這個,你要輸出多個的話,又涉及到循環結構了,在PL/SQL里邊,流程控制,流程控制就分成兩個,叫條件判斷,基本上每個語言,都有基本的流程控制,條件判斷和循環,這樣兩塊,那么條件判斷這一塊,它使用的有兩種,一種叫if,then,然后,elseif then,else,就這結束了,else是最后一種情況,記得最后加上endif,表明你這個if是結束的,因為它里邊沒有像JAVA里面講的大括號,我們大括號可以明確的指出來,他這里沒有,沒有的話就用關鍵字去結束了,最后叫end if,這是一個,方式一,還有一種方式,case,這個我們接觸過,SQL里面接觸過,when這種情況,再when再then,最后就直接加上這種情況,有一個end,end結束,這是條件判斷的兩種方式,我們給大家講到時候,還有一個循環結構,這個呢有三種,方式三,三種,一個叫loop,循環,省略號就相當于寫循環體了,循環什么東西,然后你得指明結束的條件,exit when,當循環這個條件的時候,就結束,然后end loop,表示結束,我們講循環的時候,JAVA里面說了,有定義了四部分,條件,循環體,循環的迭代部分,還有循環的條件,循環的條件就是你終止的條件,那顯然你的循環體是放在這兒的,然后exit when,相當于循環條件,就是什么時候終止,然后你要有迭代的話,這里面也行,放到這一塊也行,最后還是結束,第二種方式叫while,當你怎么著的時候,我就開始執行這個循環體,執行完了以后,就end loop,這是第二種方式,最后一種,for唄,for他定義一個變量,寫上一個i,定義一個變量,讓這個變量從哪哪開始,并且到哪哪結束,這跟我們JAVA里面很像,JAVA里面也是定義一個局部變量i,然后讓i從1開始,i小于等于100,他也是這種類似的格式,指明它是loop循環,最后給他end一下,三種格式講完了以后呢,基本的流程控制就說完了,然后這里還涉及到兩個關鍵字,比如他講的goto,他就是像我們JAVA里面講的break,后面可以加一個參,表示跳出他指定那一層的循環,然后這goto也是這個效果,它相當于我們剛才說的break,就叫goto,還有一個叫exit,表示退出,是兩個關鍵字,然后流程控制,流程控制完了以后,我們聲明一個記錄類型,我把100號員工的,工資,hire_date,employee_id,給他輸出出來,你可以把他整個看成是一個標簽,一個對象,你要想輸出多個record對象的話,比如80號部門的,所有員工的他的信息,那就得走一個循環,再輸出一條,再輸出循環,要用到流程控制的部分,還需要用到一個概念,叫游標,游標的使用,這是講這個,多條語句的話,他呢可以這樣理解,類似于JAVA中的,Iterator,迭代器,迭代器的作用是什么,作用于集合,用于集合的遍歷,是吧,集合遍歷的時候使用的是游標,他兩的作用是類似的,游標,一個箭頭,輸出這一條以后,再往下,再往下,整個效果不是遍歷嗎,就是這個意思,游標的使用,其實我們想,上面的四點都是為了后面做鋪墊,還有一個,第五個,異常的處理,每一個語言,稍微成熟一點的話,一定會考慮到異常如何來處理,比如人生病一樣,語言多強大,這個人多壯,你再壯也可能生病,一旦出現異常的時候,你就告訴我生病了怎么辦,那你就要考慮到異常的處理,PL/SQL同樣如此,他異常的處理和JAVA有點不一樣,JAVA里的try catch,throws兩種方式,他這里有三種方式,這就不具體寫了,到時再說,講這前五個,都是為了第六個和第七個做鋪墊的,講前面這些,希望我們學PL/SQL,目標就是為了大家掌握第六點和第七點,會寫一個,存儲函數,還有叫存儲過程,就是前面這些東西,就跟你做select語句一樣,select完了以后,保存不下來,你留不住,就是你這次用了就完了,下次還得重寫,那么寫一個存儲函數,或者存儲過程,這個是可以保存到硬盤中的,這次你寫完了,下次你想調,就直接來調,你想左邊這,第三項就叫函數
存儲函數,還有叫存儲過程,就是前面這些東西,就和你說select語句一樣,select完了以后他保存不下來,你留不住,就是你這次用了就完了,然后下次還得重寫,那么寫一個存儲函數,或者存儲過程,這個是可以保存在硬盤中的,這次你寫完了,下次你想調,直接來調,你像左邊這,第三項叫函數,Functions,這個就是存儲函數,當你寫的存儲函數就放到這,就類似于你寫一個表一樣,表的話我們關機開機表都有,這個存儲函數也有,你這個函數這個東西可以多次調用,這個是需要我們大家可以寫的,特別復雜的,可以寫好多行的,不用,畢竟我們不是做PL/SQL程序員,你會寫一個基本的存儲函數,存儲過程,他兩有啥區別,你把他兩看成是函數,這里有返回值,這里沒有返回值,就這個區別,當你寫存儲函數和存儲過程的時候,我會用到上面講的這些,如果有多條語句,游標了,用到循環,然后如果變量很多的話,我們可以 把變量放到記錄類型里面,這個都涉及到了,假設我要查詢一個employee_id,作為一個自變量,我存到這個函數里邊,返回這個人的工資,這個人沒有的話,你告訴我怎么辦,就有異常處理,所以寫這兩個呢,會用到上面的一些東西,第七個,會寫一個觸發器,觸發器是另一個東西,trigger,你看這,這里有一個叫Triggers,這個就是觸發器,觸發器跟這個名字很像,你操作一個什么東西,他就自動的觸發了他,然后他就開始執行,相當于后臺的一個進程一樣,這樣來理解,他也是可以讓我們去編寫一個的,有點類似于函數,但是比這兩個感覺上要簡單一些,這是我們講整個SQL的整個格式,內容,上節課稍微提了一下記錄類型,再回憶一下
包括前面說的如何來定義一個變量,我們習慣用v下劃線表示變量,起個名,常量C開頭,異常E開頭,然后游標,游標的英文就是cursor,表明這個是一個游標,記錄類型,加一個record,表明是記錄類型
然后復合類型,我們再回一下一下把之前的說一說
變量,記錄類型等聲明,比較像類里的成員變量,都放這,整個程序在運行的過程中,需要用到哪些變量,你需要定義的,都放在declare里,一個定義,一個賦值,當然你要放在begin里也行,就是變量的聲明放到這,賦值的時候放在begin里也可以,因為begin是我們程序真正的執行部門,這個程序執行過程當中,如果出現異常的話,我們要考慮異常的處理,所以加了一個exception,就是異常的處理,這里完了以后,我這個程序就結束了,end加上分號結束,那比如我們寫一個,我現在想查詢一下,這個employees表當中的,employee_id員工的,工資是多少,他的工資是多少,相當于我只要在這里查詢這個人的工資,給他放在一個變量里,把這個變量打印出來,那我就在這里定義一個變量,v_sal,這個變量,這個變量的類型,number類型的,工資給他定義成8位的,兩位小數,你要給他指定一個值也行,這里面需要注意,在PL/SQL當中,賦值的話,是冒號等于,JAVA中是啥,是等于,JAVA中要想判斷誰跟誰等不等,是等等,我們PL/SQL中就是等了,SQL里也是等,所以如果等號表示真正的相等了,定義一個變量,我就放在這里執行,執行的時候,一個PL/SQL語句塊,一個增刪改查,他都可以用,只不過查的時候,不是select了,是select into,因為用到變量了,select salary,into這個v_sal,放到這個變量里,然后哪個表里的,from employees,where employee_id,等于123,這個人的工資,給他放在這個變量里,寫PL/SQL語句的時候,標點是很嘔心的,你要是習慣于把它打成多行,打成多行就這樣,在這是沒有標點的,在最后是有的,放到這個變量里了,變量里你想打印,你得再輸出一下dbms_output.put_line,然后把v_sal給他打印出來,你也可以在這里標注一下,是工資,salary,是多少,這兒呢不涉及到異常處理,所以我們先給他干掉,end結束,我這一執行的話,有可能出來,但是沒東西declarev_sal number(8,2) := 0;beginselect salary into v_salfrom employeeswhere employee_id = 123;dbms_output.put_line('salary: '||v_sal);end;
set serveroutput on,這個每次都要記得,沒分號
必須把這個開啟了,表明可以打印東西
6500光出工資,是誰我不知道,想看看是誰,加一個employee_id,id的話,你不能在這寫employee_id了,因為它識別不了,還得放在一個變量里,number類型的,這里你給他指定值也行,不指定也沒事,不指定的話你在這給他寫上,select salary,employee_id,into他,逗號v_emp_id,放在這兩個變量里,記住要對應,salary定義在這里的是第一個的,這是第二個,類型得相互匹配的,然后你再打印就可以了,就這樣declarev_sal number(8,2) := 0;v_emp_id number(10);beginselect salary,employee_id into v_sal,v_emp_idfrom employeeswhere employee_id = 123;dbms_output.put_line('employeeid:'||v_emp_id||'salary:'||v_sal);end;
employeeid 123,工資6500,加一個hire_date,加一個email,那你就在這加唄,v_email,email類型是varchar類型的,20,沒有賦值,v_hire_date,date類型的,分號,每一個聲明都分號結束,然后依次的把這幾個給你放進去,email,hire_date,這四個依次放入你剛才聲明的變量里,然后打印就可以了,然后我們把這四個變量打印declarev_sal number(8,2) := 0;v_emp_id number(10);v_email varchar2(20);v_hiredate date;beginselect salary,employee_id,email,hire_date into v_sal,v,emp_id,v_email,v_hire_datefrom employeeswhere employee_id = 123;dbms_output.put_line('employeeid: '||v_emp_id||'salary: '||v_sal||'email: '||v_email||'hire_date'||v_hiredate);end;
這就是定義的信息,就這樣操作,這里是定義了幾個成員變量,這里是給成員變量賦值,這就是打印,就這個意思,有了這個以后,我們說這幾個成員變量,叫成員變量還有點牽強,成員變量有類,有類才會有成員變量,這里連類也沒有,這個變量,我給他放到一個記錄類型里,記錄類型你可以假設,當然沒有這么說的,你可以看成是JAVA中的一個類,既然是個類,JAVA類里面就可以有這么幾個變量,然后我再造一個類的對象,一個對象就可以有這幾個變量的,我們再有一個記錄類型,記錄類型的話是這樣,格式type,取個名,emp_record,is record,這個名字就是一種習慣,你不這樣寫沒事,type記錄類型的名字,它是一個record指明,然后括號里面指明這個變量,就是我們剛才聲明的這一個,最后加上一個括號,給他括起來,分號結束,然后改,這個就不要了,這就聲明了一個記錄類型,聲明了一個記錄類型,相當于是一個類,通過類的對象去調用成員變量的,聲明一個記錄類型,然后這兒呢你要提供一個記錄類型的變量,聲明一個記錄類型的變量,變量v開頭的,v_emp_record,他這個變量是這個類型的,分號結束,就這樣寫,既然是一個變量,我們在JAVA里面有點類似于一個對象,這個變量擁有這幾個變量,然后我在下面寫的時候就不用這么寫了,我select依次放入這幾個變量,不用寫這幾個變量了,直接放在這里,放到他里邊,然后打印的時候,打印的是這個變量的,相當于是這個對象的成員變量,這個對象的他declaretype emp_record is record(v_sal number(8,2) := 0,v_emp_id number(10),v_email varchar2(20),v_hiredate date);v_emp_record emp_record;beginselect salary,employee_id,email,hire_date into v_emp_recordfrom employeeswhere employee_id = 123;dbms_output.put_line('employeeid: '||v_emp_record.v_emp_id||','||'salary: '||v_emp_record.v_sal||','||'email: '||v_emp_record.v_email||','||'hire_date: '||v_emp_record.v_hiredate)end;
當然理解上不一樣了,你原來的要好一點了,他這里是一個整體來出現的,record這個對象,你要寫一個簡單的也行,比如最簡單的就是declare,我聲明一個type,salary_record is record,有一個括號,分號結束,要是變量不多的話,多的話你就寫成多行,定義兩個變量,定義v_name,v_name是varchar2,v_salary是number類型的,定義了一個記錄類型,然后給一個記錄類型的變量,它是他這個類型的,結束,這個就是declare就寫完了,再寫上begin,這是程序執行的部分,他的這個變量,v_name,賦值冒號等于,劉德華,v_salary記錄類型的,冒號等于這個值,然后打印,打印的話,你直接打印他不行,看不著,打印他,然后結束有分號declaretype salary_record is record(v_name varchar2(20),v_salary number(10,2) );v_sal_record salary_record;beginv_sal_record.v_name := '劉德華';v_sal_record.v_salary := 120000;dbms_output.put_line('name:'||v_sal_record.v_name||'salary:'||v_sal_record.v_salary);end;
比剛才那個要簡單,這一個基本的,這也是一個記錄類型,是我們自己定義了一個,他你看成是一個類,類里面兩個變量,聲明一個類的對象,對象調的屬性,給屬性賦值,然后打印對應的屬性,所以你要是會一個編程語言的時候,當然有其你還會一些復雜的,然后再學這些簡單的時候,你會觸類旁通,這就是說人的大腦的這個,很牛的一個功能,就是一種聯系你想到了,所以人不可以失去聯想,這個叫記錄類型的概念,記錄類型是干什么的,如果你想打印或者操作這幾個變量,這幾個變量有點多,我可以把它放在一個記錄類型里,變量有點多,我把一個變量放到記錄類型里,操作這個記錄類型的對象,到這里不叫變量,叫對象,操作記錄類型的變量,通過記錄類型的變量來操作變量,就是記錄類型的一個作用,我們再回到剛才這個例子,剛才寫的這個例子,打印employees表里信息的,這個我們剛才說,記錄類型里面這幾個變量,實際上我們操作的是employees表里面的變量依次的賦給記錄類型里的變量,當然我們這里面,有可能像我們的id,什么salary,工資,你不能整太小了,整太小了以后,當你把salary往里放的時候,可能放不進去了,給我整這個,工資用一個4位數來表示,用了兩位數小數declaretype emp_record is record(v_sal number(4,2) := 0,v_emp_id number(10),v_email varchar2(20),v_hiredate date);v_emp_record emp_record;beginselect salary,employee_id,email,hire_date into v_emp_recordfrom employeeswhere employee_id = 123;dbms_output.put_line('employeeid: '||v_emp_record.v_emp_id||'salary:'||v_emp_record.v_sal||'email:'||v_emp_record.v_email||'hire_date:'||v_emp_record.v_hiredate);end;
為了防止我出錯,我們有一個百分號type的一個詞,他表示什么意思,我這兒就不寫他了,我們這里可以不要了,反正下面已經重新指定了,我讓他和employees表里的,salary工資的聲明的類型和精度是一樣的,用百分號type,表明這個類型是一樣的,同樣的這里這樣來修改,date你改也行,不改也行,他這個大小是不變的,就這樣,聲明了幾個類型,動態的來獲取,相對應employees表里的,叫字段也好,或者叫列也好declare type emp_record is record(v_sal employees.salary%type,v_emp_id employees.employee_id%type,v_email employees.email%type,v_hiredate employees.hire_date%type);v_emp_record emp_record;beginselect salary,employee_id,email,hire_date into v_emp_recordfrom employeeswhere employee_id = 123;dbms_output.put_line('salary:'||v_emp_record.v_sal||'employeeid:'||v_emp_record.v_emp_id||'email:'||v_emp_record.v_email||'hire_date:'||v_emp_record.v_hiredate);
我們還是可以再升級一下,這個需要大家會,我們這里面也有,然后你現在只是獲取了employees表里的個別幾個列,我現在想獲取所有的列,所有的列也都放在一個記錄類型里面,那我們就依次在這里給他多寫幾列,把每一個列都寫出來,然后select的時候每一個列都分別賦給record這個變量里,然后打印的時候,把他里面的這么多都打了,這是一種方式,再一種方式呢,說一個他這里面的注釋,就是杠杠,單行注釋,多行注釋和JAVA里面一樣,我把剛才的聲明都給注了,v_emp_record,這個叫記錄類型,employees%rowtype,這個employees表里的對象,然后每一列什么類型的,我完全跟你一樣,我們在這里處理的時候,將employees表里的信息全放到record里面,然后呢我再打印一個信息,你想打誰就打誰,你這個就不能這樣寫了,因為你上面沒有聲明,相當于也可以給他聲明,跟你這里面的名一樣,所以這里是employee_id,舉幾個例子,我就從這里面輸出幾項,salary,email,hire_date,當然還有其他的,比如department_id,我輸出一下你這個變量里面的,幾個你想輸的字段declarev_emp_record employees%rowtype;beginselect * into v_emp_recordfrom employeeswhere employee_id = 123;dbms_output.put_line('employeeid:'||v_emp_record.salary||'salary:'||v_emp_record.salary||'email:'||v_emp_record.email||'hire_date:'||v_emp_record||'department_id:'||v_emp_record.hire_date);end;
這兒呢更簡潔,這兒你不能看成是一行,這其實也是一個記錄類型,只不過這個記錄類型,跟你employees這個表的結構,一樣的,所以我就一行給你代替了,rowtype它是使用在表的,你這里只是使用在某一列的,某一列的加上百分號type,跟你一列的類型一樣,這個是跟表的類型一樣,然后select *往里面放就完了,就是這個,那這個升級的話,你要再升還可以升級,升級什么,這個寫死的,這個定一個,123,聲明一個,v_emp_id,類型,10,然后呢,就這樣寫吧,在這賦值,冒號等于,我們不寫123了,v_emp_id,動態的來獲取這個值,有一個變量declarev_emp_record employees%rowtype;v_emp_id number(10);beginv_emp_id := 133;select * into v_emp_recordfrom employeeswhere employee_id = v_emp_id;dbms_output.put_line('employeeid:'||v_emp_record.employee_id||'email:'||v_emp_record.email||'salary:'||v_emp_record.salary||'hire_date:'||v_emp_record.hire_date);end;
這又換人了,就是這個人,講記錄類型,我們剛才講的都是select,當然除了select以外,還有增刪改,寫一個,decalre,改吧,改一個,把某個人的工資給他加上100,某個人的工資給他加上100,把誰的工資給他加上100,就定義一個變量,id number類型的,10,執行,執行update這樣一個概念,update employees,set,set salary,salary加上100,where employee_id等于v_emp_id,v_emp_id賦個值,dbms_output.put_line,打印salary打印不了,改了要放到一個變量里面才行,我這里就不打了,輸出一個說執行成功,enddeclarev_emp_id number(10);beginv_emp_id := 133;update employeesset salary = salary + 100where employee_id = v_emp_id;dbms_output.put_line('執行成功');end;
我開始寫了一個觸發器,一執行表的update操作就執行了,這里你就能夠看到觸發器的作用,這里我給他rollback,記錄類型,你把這個概念搞清楚,我們下一個要講的就是流程控制了
?
總結
以上是生活随笔為你收集整理的plsql(轻量版)_记录类型2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: plsql(轻量版)_记录类型1
- 下一篇: plsql(轻量版)_流程控制