1. 程式人生 > >oracle筆記pl_sql基本語法記錄型別01

oracle筆記pl_sql基本語法記錄型別01

/*

pl/sql
基本語法
記錄型別

*/

/*
1.pl/sql基本的語法格式

2.記錄型別 type ... is record(,,,);

3.流程控制
 3.1條件判斷(兩種)
 方式1:if ... then elsif then ... else ... end if;
 方式2:case ... when ... then ... end;
 
 3.2迴圈結構(三種)
  方式1:loop ... exit when ... end loop;
  方式2:while ... loop ... end loop;
  方式3:for i in ... loop ... end loop;
  
 3.3 goto 、exit
     

4.遊標的使用(類似於java中的Iterator)

5.異常的處理(三種方式)

6.會寫一個儲存函式(有返回值)、儲存過程(沒有返回值)

7.會寫一個觸發器


*/

--
set serveroutput on

--
--DECLARE
   --宣告的變數、型別、遊標
BEGIN
   --程式的執行部分(類似於java中的main()方法)
dbms_output.put_line('hello world!');
--EXCEPTION
   --針對begin塊中出現的異常,提供處理的機制
   --when .... then ...
  --when  .... then ...                       
END;


--最簡單的pl/sql語句塊
BEGIN
dbms_output.put_line('hello world!');  
END;


--
DECLARE
   --宣告變數
   v_sal NUMBER(10, 2);
BEGIN
   --sql語句的操作:select ... into ... from ... where ...
   SELECT salary INTO v_sal FROM employees WHERE employee_id = 100;
   --列印
   dbms_output.put_line(v_sal);  
END;

--
DECLARE
   --宣告變數
   v_sal NUMBER(10, 2);
   v_email varchar2(40);
   v_hire_date DATE;
BEGIN
   --sql語句的操作:select ... into ... from ... where ...
   SELECT salary, email, hire_date INTO v_sal, v_email, v_hire_date FROM employees WHERE employee_id = 100;
   --列印
   dbms_output.put_line(v_sal);
   dbms_output.put_line(v_email); 
   dbms_output.put_line(v_hire_date); 
   dbms_output.put_line(v_sal || ',' || v_email || ',' || v_hire_date); 
END;

--
DECLARE
   --宣告變數
   v_sal NUMBER(10, 2);
   v_email varchar2(40);
   v_hire_date varchar2(40);
BEGIN
   --sql語句的操作:select ... into ... from ... where ...
   SELECT salary, email, to_char(hire_date, 'yyyy-mm-dd') INTO v_sal, v_email, v_hire_date FROM employees WHERE employee_id = 100;
   --列印
   dbms_output.put_line(v_sal);
   dbms_output.put_line(v_email); 
   dbms_output.put_line(v_hire_date); 
   dbms_output.put_line(v_sal || ',' || v_email || ',' || v_hire_date); 
END;


--
DECLARE
   --宣告變數
   v_sal employees.salary%TYPE; -- 動態獲取employees表中的salary列的資料型別
   v_email employees.email%TYPE; 
   v_hire_date employees.hire_date%TYPE;
BEGIN
   --sql語句的操作:select ... into ... from ... where ...
   SELECT salary, email, hire_date INTO v_sal, v_email, v_hire_date FROM employees WHERE employee_id = 100;
   --列印
   dbms_output.put_line(v_sal);
   dbms_output.put_line(v_email); 
   dbms_output.put_line(to_char(v_hire_date, 'yyyy-mm-dd')); 
   dbms_output.put_line(v_sal || ',' || v_email || ',' || to_char(v_hire_date, 'yyyy-mm-dd')); 
END;

--

--使用記錄型別
DECLARE
   --宣告一個記錄型別
   TYPE emp_record IS RECORD(
   v_sal employees.salary%TYPE, -- 動態獲取employees表中的salary列的資料型別
   v_email employees.email%TYPE, 
   v_hire_date employees.hire_date%TYPE
   );
   --定義一個記錄型別的成員變數
   v_emp_record emp_record;
BEGIN
   --sql語句的操作:select ... into ... from ... where ...
   SELECT salary, email, hire_date INTO v_emp_record FROM employees WHERE employee_id = 100;
   --列印
   dbms_output.put_line(v_emp_record.v_sal);
   dbms_output.put_line(v_emp_record.v_email); 
   dbms_output.put_line(to_char(v_emp_record.v_hire_date, 'yyyy-mm-dd')); 
   dbms_output.put_line(v_emp_record.v_sal || ',' || v_emp_record.v_email || ',' || to_char(v_emp_record.v_hire_date, 'yyyy-mm-dd')); 
END;

--
DECLARE
--v_salary VARCHAR2(20); --這樣寫也正確
--v_salary employees.salary%TYPE; -- 動態獲取employees表中的salary列的資料型別
v_salary NUMBER(10, 2);
BEGIN
  SELECT salary INTO v_salary FROM employees WHERE employee_id = 100;
  --列印
   dbms_output.put_line(v_salary);
END;

--

DECLARE
--v_salary VARCHAR2(20); --這樣寫也正確
--v_salary employees.salary%TYPE; -- 動態獲取employees表中的salary列的資料型別
v_salary NUMBER(10, 2) := 666.88; -- :=符號表示賦值
BEGIN
  --SELECT salary INTO v_salary FROM employees WHERE employee_id = 999; --沒有編號為999的員工,查不到該員工
  --列印
   dbms_output.put_line(v_salary);
END;


--
DECLARE 
--變數、記錄型別等的宣告
--定義一個變數
v_salary NUMBER(8, 2) := 0.00; -- :=符號表示賦值
BEGIN
  --程式的執行部分
  SELECT salary INTO v_salary FROM employees WHERE employee_id = 123;
  dbms_output.put_line('薪水為' || v_salary);
  --EXCEPTION
    --異常的處理    
END;


--
DECLARE 
--變數、記錄型別等的宣告
--定義一個變數
v_salary NUMBER(8, 2) := 0.00; -- :=符號表示賦值
v_lastname VARCHAR2(40); --也可以不賦值
v_email VARCHAR2(40) := '
[email protected]
'; v_hiredate DATE := SYSDATE; BEGIN --程式的執行部分 SELECT salary, last_name, email, hire_date INTO v_salary, v_lastname, v_email, v_hiredate FROM employees WHERE employee_id = 123; dbms_output.put_line('姓名為' || v_lastname || ' 薪水為' || v_salary || ' 郵箱為' || v_email || ' 入職日期為' || v_hiredate); --EXCEPTION --異常的處理 END; -- DECLARE --變數、記錄型別等的宣告 --宣告一個記錄型別 TYPE emp_record IS record( v_salary NUMBER(8, 2) := 0.00, -- :=符號表示賦值 v_lastname VARCHAR2(40), --也可以不賦值 v_email VARCHAR2(40) := '
[email protected]
', v_hiredate DATE := SYSDATE ); --宣告一個記錄型別的變數 v_emp_record emp_record; BEGIN --程式的執行部分 SELECT salary, last_name, email, hire_date INTO v_emp_record FROM employees WHERE employee_id = 123; dbms_output.put_line('姓名為' || v_emp_record.v_lastname || ' 薪水為' || v_emp_record.v_salary || ' 郵箱為' || v_emp_record.v_email || ' 入職日期為' || v_emp_record.v_hiredate); --EXCEPTION --異常的處理 END; -- DECLARE --變數、記錄型別等的宣告 --宣告一個記錄型別 TYPE emp_record IS record( v_salary NUMBER(8, 2) := 0.00, -- :=符號表示賦值 v_lastname VARCHAR2(40), --也可以不賦值 v_email VARCHAR2(40) := '
[email protected]
', v_hiredate DATE := SYSDATE ); --宣告一個記錄型別的變數 v_emp_record emp_record; BEGIN --程式的執行部分 dbms_output.put_line('姓名為' || v_emp_record.v_lastname || ' 薪水為' || v_emp_record.v_salary || ' 郵箱為' || v_emp_record.v_email || ' 入職日期為' || v_emp_record.v_hiredate); --EXCEPTION --異常的處理 END; -- DECLARE --變數、記錄型別等的宣告 --宣告一個記錄型別 TYPE emp_record IS record( v_salary NUMBER(10, 2) := 0.68, -- :=符號表示賦值 v_lastname VARCHAR2(40), --也可以不賦值 v_email VARCHAR2(40) := '[email protected]', v_hiredate DATE := SYSDATE ); --宣告一個記錄型別的變數 v_emp_record emp_record; BEGIN --程式的執行部分 dbms_output.put_line('姓名為' || v_emp_record.v_lastname || ' 薪水為' || v_emp_record.v_salary || ' 郵箱為' || v_emp_record.v_email || ' 入職日期為' || v_emp_record.v_hiredate); dbms_output.put_line('姓名為' || v_emp_record.v_lastname || '。'); --將number數字型別轉換成字串型別 dbms_output.put_line('第1種薪水為' || to_char(v_emp_record.v_salary, '999,999,999.999')); dbms_output.put_line('第2種薪水為' || to_char(v_emp_record.v_salary, '000,999,999.999')); dbms_output.put_line('第3種薪水為' || to_char(v_emp_record.v_salary, 'L000,999,999.999')); dbms_output.put_line('第4種薪水為' || to_char(v_emp_record.v_salary, '$999,999,999.999')); dbms_output.put_line('第5種薪水為' || to_char(v_emp_record.v_salary, '000,000,000.00')); dbms_output.put_line('第6種薪水為' || to_char(v_emp_record.v_salary, '$000,000,000.00')); dbms_output.put_line('第7種薪水為' || to_char(v_emp_record.v_salary, '$000000000.00')); dbms_output.put_line('第8種薪水為' || to_char(v_emp_record.v_salary, '000000000.00')); dbms_output.put_line('第9種薪水為' || to_char(v_emp_record.v_salary, '00.00')); dbms_output.put_line('第10種薪水為' || to_char(v_emp_record.v_salary, '0.00')); --EXCEPTION --異常的處理 END; --簡單版 DECLARE TYPE salary_record IS RECORD ( v_salary NUMBER(8, 2), v_name varchar2(30) ); v_salary_record salary_record; BEGIN v_salary_record.v_salary := 68900; v_salary_record.v_name := '令狐沖'; dbms_output.put_line('姓名為' || v_salary_record.v_name || ' 薪水為' || v_salary_record.v_salary); END; --使用%ROWTYPE關鍵字 DECLARE --定義一個記錄型別 v_emp_record employees%ROWTYPE; --%ROWTYPE表示和employees表中的所有列的結構一樣 BEGIN --程式的執行部分 SELECT * INTO v_emp_record FROM employees WHERE employee_id = 123; dbms_output.put_line('姓名為' || v_emp_record.last_name || ' 薪水為' || v_emp_record.salary || ' 郵箱為' || v_emp_record.email || ' 入職日期為' || v_emp_record.hire_date); dbms_output.put_line('部門編號為' || v_emp_record.department_id); --EXCEPTION --異常的處理 END; --使用變數 DECLARE v_emp_record employees%ROWTYPE; --%ROWTYPE表示和employees表中的所有列的結構一樣 v_emp_id NUMBER(10); BEGIN v_emp_id := 100; --給v_emp_id變數賦值(為變數賦值,賦值符號使用:=) --程式的執行部分 SELECT * INTO v_emp_record FROM employees WHERE employee_id = v_emp_id; -- 使用v_emp_id變數 dbms_output.put_line('姓名為' || v_emp_record.last_name || ' 薪水為' || v_emp_record.salary || ' 郵箱為' || v_emp_record.email || ' 入職日期為' || v_emp_record.hire_date); dbms_output.put_line('部門編號為' || v_emp_record.department_id); --EXCEPTION --異常的處理 END; -- SELECT salary, employees.* FROM employees WHERE employee_id = 100; -- DECLARE v_emp_id NUMBER(10); BEGIN v_emp_id := 100; --做更新操作 UPDATE employees SET salary = salary + 500 WHERE employee_id = v_emp_id; dbms_output.put_line('執行成功'); END; /* 以下是以前的知識 */ -- SELECT 5 + 5 AS MYRESULT, DEPARTMENT_ID, CASE DEPARTMENT_ID WHEN 80 THEN 'true' ELSE 'false' END FROM EMPLOYEES WHERE DEPARTMENT_ID IN (80, 90); -- SELECT CASE 6 WHEN 6 THEN 'true' ELSE 'false' END FROM DUAL -- SELECT 3 + 3 AS myresult, CASE 6 WHEN 6 THEN 'true' ELSE 'false' END FROM DUAL --如下這種寫法會報錯,myresult識別符號無效,只能在排序的時候使用別名 SELECT 3 + 3 AS myresult, CASE myresult WHEN 6 THEN 'true' ELSE 'false' END FROM DUAL --排序的時候可以使用別名 SELECT salary sal FROM employees emp ORDER BY sal DESC SELECT 0.6 FROM dual; SELECT to_char(0.1,'fm9999990.9999') FROM dual; SELECT to_char(0.1,'9999990.9999') FROM dual;