Oracle變量、輸入輸出、SELECT?INTO、%TYPE與%ROWTYPE詳解
一、變量
1.什么是變量
在 Oracle 數據庫里,變量發(fā)揮著重要作用,它能夠存儲中間值、傳遞數據以及增強 SQL 和 PL/SQL 代碼的靈活性。
2.定義變量的語法
DECLARE --聲明的地方(聲明變量,常量,游標等等),這一塊不是必須的。 BEGIN --代碼的執(zhí)行的邏輯塊(就是要做什么) END;
BEGIN
dbms_output.put_line('你好');
END;
BEGIN
dbms_output.put_line('Hello World');
dbms_output.put_line('你好');
END;
3.變量的賦值
DECLARE
v1 varchar2(20);
v2 date;
BEGIN
v1 := 'Hello';
dbms_output.put_line(v1);
v2 := to_date('20220101', 'yyyymmdd');
dbms_output.put_line(v2);
END;日期格式是按照國外的格式輸出的

4.變量可以被多次賦值,可以被覆蓋
DECLARE v1 varchar2(20); BEGIN v1 := 'Hello'; -- dbms_output.put_line(v1); v1 := '你好'; dbms_output.put_line(v1); END;

dbms_output包主要用于調試pl/sql程序
一個變量的賦值,可以在 DECLARE 中賦初始值,也可以在 BEGIN END中進行賦值,一個變量也可以重復賦值。
練習 : 打印 數字 10 以及 打印 當前年月日 'YYYY-MM-DD'
-- 方法一: DECLARE v1 number; v2 varchar2(20); BEGIN v1 := 10; dbms_output.put_line(v1); v2 := TO_CHAR(SYSDATE, 'YYYY-MM-DD'); dbms_output.put_line(v2); END; -- 方法二: DECLARE v1 number := 10; v2 varchar2(20) := TO_CHAR(SYSDATE, 'YYYY-MM-DD'); BEGIN dbms_output.put_line(v1 || chr(10) || v2); END;

chr(10)表示換行
二、輸入輸出
1.&符號表示輸入
- 變量來源于用戶輸入值
- &后面接變量值名稱
示例:用戶輸入一個數字,輸出它的三次冪(例如:用戶輸入2,返回8)
DECLARE v1 number := &input; -- 變量值名稱可自定義 v2 number; BEGIN v2 := power(v1, 3); -- v2:=v1*v1*v1; dbms_output.put_line(v2); END;


2.關于賦值的數據類型說明
- 如果賦值的變量是字符串類型,那么在彈出的小窗口上傳值的時候,記得添加 單引號
- 如果賦值的變量是DATE類型,那么在彈出的小窗口上傳值的時候,要用 TO_DATE 這個函數轉換數據類型
示例:用戶輸入兩個變量并打印出來,一個字符串類型,一個是日期型
DECLARE v1 varchar2(20) := '&input1'; v2 DATE := &input2; BEGIN dbms_output.put_line(v1 || CHR(10) || v2); END;


練習:打印用戶輸入的兩個值的 加減乘除 對應的值(6,3)
DECLARE v1 number := &input1; v2 number := &input2; BEGIN dbms_output.put_line(v1 + v2); dbms_output.put_line(v1 - v2); dbms_output.put_line(v1 * v2); dbms_output.put_line(v1 / v2); END;


三、變量賦值 SELECT INTO
- 注意:select后面有幾個值,into后面就要有相對應的變量,注意數據類型要一致。
示例:打印某個員工的薪資(用戶輸入工號,打印他的薪資)
DECLARE v1 number := &input; v_sal number; BEGIN select sal into v_sal from emp where empno = v1; dbms_output.put_line(v_sal); END;


示例:接收一個員工的編號,將員工的姓名,工資,入職日期打印出來
DECLARE
v1 number := &input;
v_ename varchar2(20);
v_sal number;
v_hiredate date;
BEGIN
select ename, sal, hiredate
into v_ename, v_sal, v_hiredate
from emp
where empno = v1;
dbms_output.put_line(v_ename || ',' || v_sal || ',' || TO_CHAR(v_hiredate, 'YYYY-MM-DD'));
END;

練習1:輸入一個部門編號,打印這個部門的平均薪資(保留兩位小數)
輸出樣式:10號部門的平均薪資為:2916.67
DECLARE
v1 number := &input;
v_avg_sal number;
BEGIN
select round(avg(sal + nvl(comm, 0)),2) avg_sal
into v_avg_sal
from emp
where deptno = v1
group by deptno;
dbms_output.put_line(v1 || '號部門的平均薪資為:' || v_avg_sal);
END;

練習2:寫一個代碼塊,傳入一個員工姓名,將這個員工的工號,崗位打印到 OUTPUT 窗口來
DECLARE v1 varchar2(20) := '&input'; v_empno number; v_job varchar2(20); BEGIN select empno, job into v_empno, v_job from emp where ename = v1; dbms_output.put_line(v_empno || ',' || v_job); END;


四、使用%TYPE與%ROWTYPE無需寫變量數據類型
- %TYPE:引用數據庫中的某張表的某列的數據類型。
- %ROWTYPE:引用數據庫中的某張表的一行(所有字段)作為數據類型。
1.%TYPE
示例:接收一個員工的編號,將員工的姓名,工資,入職日期打印出來
DECLARE
v_EMPNO EMP.EMPNO%TYPE := &input;
v_ENAME EMP.ENAME%TYPE;
v_SAL EMP.SAL%TYPE;
v_HIREDATE EMP.HIREDATE%TYPE;
BEGIN
select ENAME, SAL, HIREDATE
into v_ENAME, v_SAL, v_HIREDATE
from EMP
where EMPNO = v_EMPNO;
dbms_output.put_line(v_ENAME || '的薪資是:' || v_SAL || '入職時間:' ||
TO_CHAR(v_HIREDATE,'YYYY-MM-DD'));
END;

2.%ROWTYPE
DECLARE
v_emp emp%ROWTYPE;
BEGIN
v_emp.EMPNO := &INPUT;
select ENAME, SAL, HIREDATE
into v_emp.ENAME, v_emp.SAL, v_emp.HIREDATE
from EMP
where EMPNO = v_emp.EMPNO;
dbms_output.put_line(v_emp.ENAME || '的薪資是:' || v_emp.SAL || '入職時間:' ||
TO_CHAR(v_emp.HIREDATE, 'YYYY-MM-DD'));
END;
練習:寫一個代碼塊,傳入一個員工姓名,將這個員工的工號,崗位打印到 OUTPUT 窗口來
將剛才寫的兩個課堂練習用 %TYPE 和 %ROWTYPE 實現(xiàn)
-- %TYPE
DECLARE
v_ENAME EMP.ENAME%TYPE := '&input';
v_EMPNO EMP.EMPNO%TYPE;
v_JOB EMP.JOB%TYPE;
BEGIN
select EMPNO, JOB into v_EMPNO, v_JOB from EMP where ENAME = v_ENAME;
dbms_output.put_line(v_ENAME || '的工號是:' || v_EMPNO || '崗位是:' || v_JOB);
END;
-- %ROWTYPE
DECLARE
v_EMP EMP%ROWTYPE;
BEGIN
v_EMP.ENAME := '&INPUT';
select EMPNO, JOB
into v_EMP.EMPNO, v_EMP.JOB
from EMP
where ENAME = v_EMP.ENAME;
dbms_output.put_line(v_EMP.ENAME || '的工號是:' || v_EMP.EMPNO || '崗位是:' ||
v_EMP.JOB);
END;

總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Oracle使用dblink實現(xiàn)跨庫訪問的實例代碼
dbLink是簡稱,全稱是databaselink,database link是定義一個數據庫到另一個數據庫的路徑的對象,database link允許你查詢遠程表及執(zhí)行遠程程序,本文給大家介紹了Oracle如何使用dblink實現(xiàn)跨庫訪問,需要的朋友可以參考下2024-03-03
oracle impdp network_link參數使用介紹
本文將介紹oracle impdp network_link參數使用方法,需要了解更多的朋友可以參考下2012-11-11
Oracle數據庫由dataguard備庫引起的log file sync等待問題
這篇文章主要介紹了Oracle數據庫由dataguard備庫引起的log file sync等待,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11

