oracle筆記pl_sql基本語法記錄型別01
阿新 • • 發佈:2018-12-19
/*
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;