玩轉oracle學習第六天,oracle學習第六天

來源:互聯網
上載者:User

玩轉oracle學習第六天,oracle學習第六天


1.上節回顧
2.PL/SQL的介紹
3.PL/SQL的基礎


理解oracle的pl/sql概念
掌握PL/SQL編程技術(包括編寫過程,函數,觸發器,包。。。)

PL/SQL是什嗎?
PL/SQL(procedural language/sql)是oracle在標準的sql語言的擴充,PL/SQL不僅允許
嵌入sql語言,


資料庫:編寫預存程序,函數,觸發器,使用的是PL/SQL語言,PL/SQL簡化了複雜度
增加程式的模組化,減小網路的傳輸的開銷,提高安全性,提高程式的運行效率
1.過程,函數,觸發器是PL/SQL編寫的
2.過程,函數,觸發器是在oracle中
3.PL/SQL是非常強大的資料庫過程語言
4.過程,函數可以在java程式中調用

傳統的操作資料庫的方法是:
java程式sql-》sql(資料庫編譯)

程式要有靈魂,一個程式員的成長是需要過程的,
PL/SQL不好的地方:
1.移植性不好,只能使用單個資料庫,不能用於其他資料庫

PL/SQL 用什麼編寫PL/SQL
PL/SQL開發工具
 PL/SQL是oracle公司提供的一個工具
 編寫預存程序,向其中插入記錄
 1.建立一個簡單的表
 create table mytest(name varchar2(20),passwd varchar2(30));
 
 2.建立預存程序
 create or replace procedure sp_pro1 is
 begin
 --執行部分
 insert into mytest values('何世陽','m123')
 end;
 /
 replace:表示有就會替換
 如何查看錯誤資訊:
 show error;
 
 如何調用預存程序?兩種方法
 (1)exec sp_pro1(參數1,參數2,。。。);
 (2)call sp_pro1(參數1,參數2,。。。);
 
 使用PL/SQL developer工具開發PL/SQL的預存程序
 create or replace procedure sp_pro2 is
 begin
 delete from mytest where name='何世陽';
 end;
 
 預存程序現在還沒有一個標準,各個資料庫有自己的預存程序編寫規則
 
 PL/SQL編程使用變數和邏輯控制語句,從而編寫很有用的功能模組
 
 簡單分類:
           |--過程
           |--函數
 塊(編程)     
           |--觸發器
           |--包
           
編寫規範:
(1)注釋
   單行注釋 --
   select * from emp where empno=7788;--取得員工資訊
   多行注釋
   /*...*/來劃分
(2)表示符號的命名規範
 1)當定義變數,建議用v_作為首碼
 2)常量,c_作為首碼
 3)遊標,_cursor作為尾碼
 4)例外,e_作為首碼,例如e_error
 
 塊的介紹:
 塊(block)是PL/SQL的基本程式單元,編寫PL/SQL程式實際就是編寫PL/SQL塊
 
 塊的結構圖:
 PL/SQL塊由三部分構成:定義部分,執行部分,例外處理部分
 如下所示:
 declear
 /*定義部分-----定義常量,變數,遊標,例外,複雜資料類型*/
 begin
 /*執行部分-----要執行的PL/SQL語句和sql語句*/
 exception
 /*例外處理部分---處理啟動並執行各種錯誤*/
 end;
 
 特別說明:
 定義部分是從delete開始的
 該部分是可選的
 執行部分是從begin開始的
 該部分是必須的
 例外處理部分是從exception開始的
 該部分是可選的
 
 java程式結果
 
 public static void main(String[] args)
 {
   int a = 1;
   try
   {
      a++;
   }
   catch(Exception e)
   {
    
   }
 }
 
 最簡單的塊:
 set serveroutput on --開啟輸出過程
 begin
 dbms_output.put_line('hello world');
 end;
 
 以上是輸出‘hello world’的塊,說明如下:
 dbms_output 是oracle所提供的包(類似java的開發包),該包包含一些過程,
 put_line就是dbms_output包的一個過程
 
 declear
  v_ename varchar2(5);--定義字串變數
  v_sal   number(7.2);
 begin
  select ename into v_ename,v_sal from emp where empno=&no;
  dbms_output.put_line('僱員名'||v_ename);
 exception
 when no_data_found then
 dbms_output.put_line('朋友,你的編號輸入有誤!');
 end;
 /
 &表示要接受控制台輸入的參數
 
 定義部分,執行部分和例外處理部分
 
 oracle事先預定義了一些例外,例如no_data_found
 
 過程:
    過程用於執行特定的操作,當建立過程時,既可以指定輸入參數,也可以指定輸出參數,通過在過程中
    使用輸入參數,可以將資料傳遞到執行部分,
    通過使用輸出參數,可以將執行部分的資料傳遞到應用環境,在sqlplus中可以使用create procedure命令來建立過程
    執行個體如下:
    (1)編寫一個過程,可以輸入僱員名,新工資,可修改僱員的工資
    (2)調用過程有兩種方法:
    (3)在java程式中調用一個預存程序
 create procedure sp_pro3(spName varchar2,newSal number) is
 --定義變數部分
 begin
 --執行部分,根據使用者名稱去修改工資
 update emp set sal=newSal where ename = spName;
 end;
 /
 
 調用以上預存程序:
 exec sp_pro3('scott',4789);
 
 java程式中調用一個預存程序
 //編寫一個java application程式測試oracle預存程序的調用
 import java.sql.*;
 1.載入驅動
 Class.forName("oracle.jdbc.driver.OracleDriver");
 2.得到串連
 Connection ct = DriverManager.getConnection("");
 3.建立CallableStatement
 CallableStatement cs = 。。。
 
 ?如何使用過程返回值??
 
 函數:函數和過程本身是一家,函數用於返回特定的資料,當建立函數時,在函數頭部必須包含return語句
 
 函數案例:
  案例:輸入僱員姓名,返回該僱員的年薪
 create function sp_fun2(spName carchar2) return
 number is yearSal number(7,2);
 begin
 --執行部分
 select sal*12+nvl(comm,0)*12 into yearSal from emp where ename=spName;
 return yearSal;
 end;
 調用
 1)在sqlpls中進行函數調用
 tome number
 call sp_fun2('scott') into:abc;
 print abc
 2)同樣我們可以在java程式中調用該函數
 select annual_income('SCOTT') from dual;
 可以通過rs.getInt(1)得到返回的結果
 
 觸發器:觸發器是指隱含的執行的預存程序。當定義觸發器時,必須要指定觸發器的事件和觸發的操作
 
 
 包:包用於在邏輯上組合過程和函數,它由包規範和包體兩部分組成
 建立包(聲明):
 create package sp_package is
 procedure update_sal(name varchar2,newsal number);
 function annual_income(name varchar2) return number;
 end;
 /
 
 給包實現包體:
 create or replace package sp_package is
 procedure update_sal(name varchar2,newsal number)
 is
 begin
 update emp set sal=newsal where ename=name;
 end;
 function annual_income(name varchar2)
 return number is
 annual_salary number;
 begin
 select sal*12+nvl(comm,0) into annual_salary from emp
 where ename=name;
 return annual_salary;
 end;
 end;
 /
 
 如何調用包,調用包中的過程和函數,調用的時候,需要在過程和函數面前添加包名
 exec sp_package.update_sal('SCOTT',120);
 
 
 PL/SQL基礎 定義並使用變數
 標量(scalar)-常用類型
 在PL/SQL中
 標量定義的案例:
 (1)定義一個變長的字串
 v_ename varchar2(20)
 
 (2)使用一個變數
 資料賦值:    :=
 declare
 c_tax_rate number(3,2) := 0.03;
 
 v_ename varchar2(5);
 v_sal   number(7,2);
 v_tax_sal number(7,2);
 begin
 --執行
 select ename,sal into v_ename,v_sal from emp where empno = &no;
 --計算所得稅
 v_tax_sal := v_sal*c_tax_rate;
 --輸出
 dbms_output.put_line(姓名是:'' || v_ename ||'工資是:'||v_sal||'交稅:'||v_tax_sal) ;
 end;
 
 標量(scalar)-使用%type類型:
 v_ename emp.ename%type;//表示變數v_ename定義的大小和表emp的欄位enamel大小一致
 
 複合變數(composite)介紹:
 用於存放多個值的變數,主要包括:
 類似進階語言的結構體
 type emp_recode_type is recode
 (
 name emp.ename%type,
 salary emp.sal%type,
 title emp.job%type
 );
 //定義了一個PL/SQL記錄類型emp_recode_type,類型包含是哪個資料name,salary,title
 sp_recode emp_recode_type;//定義了一個變數sp_recode,它的類型為emp_recode_type
 
 具體編寫:
 declare
 type emp_recode_type is record(name emp.ename%type,
 salary emp.sal%type,
 title emp.job%type);
 sp_recode emp_recode_type;
 begin
 select ename,sal,job into sp_record from emp where empno=7788;
 dbms_output.put_line('員工名:' || sp_record.name || '工資是' || sp_record.salary);
 end;
 
 複合類型:
 相當於進階進階語言中的數組,但是需要注意的是在進階語言中數組的下標不能為負數,但是此處是可以為負數的
 
 PL/SQL表執行個體:
 declare
 --index by binary_integer表示下標是整數,正整數和負整數都可以的
 type sp_table_type is table of emp.ename%type index by binary_integer;
 sp_table sp_table_type;
 begin
 select ename into sp_table(0) from emp where empno=7788;
 dbms_output.put_line('員工名:' || sp_table(0));
 end;
 
 ?如何返回多條資料類型??
 
 複合變數-參照變數
 參照變數是指用於存放數值指標的變數,通過使用參照變數,可以使得應用程式共用相同的對象,從而降低佔用的控制項,在編寫
 PL/SQL程式時,可以使用遊標比那輛(ref cursor)和物件類型變數(ref obj_type)兩種參照變數類型
 
 參照變數-ref cursor遊標變數
 使用遊標時,當定義遊標時不需要
 
 declare
 --定義遊標類型sp_emp_cursor
 type sp_emp_cursor is ref cursor;//定義了一個遊標
 --定義遊標變數
 test_cursor sp_emp_cursor;
 --定義變數
 v_ename emp.ename%type;
 v_sal emp.sal%type;
 begin
 --執行
 --把test_cursor 和一個 select結合,即test_cursor指向結果集
 open test_cursor for select ename,sal from emp where deptno=&no;
loop
 fetch test_cursor into v_ename,v_sal;
 --判斷工資高低,決定是否更新
 
 --判斷是否test_cursor為空白
 exit when test_cursor%notfound;
 dbms_output.put_line('名字:' || v_name || '工資:' || v_sal);
end loop;
 end;
 
 複合變數-巢狀表格
 
 複合變數-複合表

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.