Oracle變量、輸入輸出、SELECT?INTO、%TYPE與%ROWTYPE詳解
一、變量
1.什么是變量
在 Oracle 數(shù)據(jù)庫(kù)里,變量發(fā)揮著重要作用,它能夠存儲(chǔ)中間值、傳遞數(shù)據(jù)以及增強(qiáng) SQL 和 PL/SQL 代碼的靈活性。
2.定義變量的語(yǔ)法
DECLARE --聲明的地方(聲明變量,常量,游標(biāo)等等),這一塊不是必須的。 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;
日期格式是按照國(guó)外的格式輸出的
4.變量可以被多次賦值,可以被覆蓋
DECLARE v1 varchar2(20); BEGIN v1 := 'Hello'; -- dbms_output.put_line(v1); v1 := '你好'; dbms_output.put_line(v1); END;
dbms_output包主要用于調(diào)試pl/sql程序
一個(gè)變量的賦值,可以在 DECLARE 中賦初始值,也可以在 BEGIN END中進(jìn)行賦值,一個(gè)變量也可以重復(fù)賦值。
練習(xí) : 打印 數(shù)字 10 以及 打印 當(dāng)前年月日 '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.&符號(hào)表示輸入
- 變量來(lái)源于用戶輸入值
- &后面接變量值名稱(chēng)
示例:用戶輸入一個(gè)數(shù)字,輸出它的三次冪(例如:用戶輸入2,返回8)
DECLARE v1 number := &input; -- 變量值名稱(chēng)可自定義 v2 number; BEGIN v2 := power(v1, 3); -- v2:=v1*v1*v1; dbms_output.put_line(v2); END;
2.關(guān)于賦值的數(shù)據(jù)類(lèi)型說(shuō)明
- 如果賦值的變量是字符串類(lèi)型,那么在彈出的小窗口上傳值的時(shí)候,記得添加 單引號(hào)
- 如果賦值的變量是DATE類(lèi)型,那么在彈出的小窗口上傳值的時(shí)候,要用 TO_DATE 這個(gè)函數(shù)轉(zhuǎn)換數(shù)據(jù)類(lèi)型
示例:用戶輸入兩個(gè)變量并打印出來(lái),一個(gè)字符串類(lèi)型,一個(gè)是日期型
DECLARE v1 varchar2(20) := '&input1'; v2 DATE := &input2; BEGIN dbms_output.put_line(v1 || CHR(10) || v2); END;
練習(xí):打印用戶輸入的兩個(gè)值的 加減乘除 對(duì)應(yīng)的值(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后面有幾個(gè)值,into后面就要有相對(duì)應(yīng)的變量,注意數(shù)據(jù)類(lèi)型要一致。
示例:打印某個(gè)員工的薪資(用戶輸入工號(hào),打印他的薪資)
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;
示例:接收一個(gè)員工的編號(hào),將員工的姓名,工資,入職日期打印出來(lái)
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;
練習(xí)1:輸入一個(gè)部門(mén)編號(hào),打印這個(gè)部門(mén)的平均薪資(保留兩位小數(shù))
輸出樣式:10號(hào)部門(mén)的平均薪資為: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 || '號(hào)部門(mén)的平均薪資為:' || v_avg_sal); END;
練習(xí)2:寫(xiě)一個(gè)代碼塊,傳入一個(gè)員工姓名,將這個(gè)員工的工號(hào),崗位打印到 OUTPUT 窗口來(lái)
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無(wú)需寫(xiě)變量數(shù)據(jù)類(lèi)型
- %TYPE:引用數(shù)據(jù)庫(kù)中的某張表的某列的數(shù)據(jù)類(lèi)型。
- %ROWTYPE:引用數(shù)據(jù)庫(kù)中的某張表的一行(所有字段)作為數(shù)據(jù)類(lèi)型。
1.%TYPE
示例:接收一個(gè)員工的編號(hào),將員工的姓名,工資,入職日期打印出來(lái)
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 || '入職時(shí)間:' || 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 || '入職時(shí)間:' || TO_CHAR(v_emp.HIREDATE, 'YYYY-MM-DD')); END;
練習(xí):寫(xiě)一個(gè)代碼塊,傳入一個(gè)員工姓名,將這個(gè)員工的工號(hào),崗位打印到 OUTPUT 窗口來(lái)
將剛才寫(xiě)的兩個(gè)課堂練習(xí)用 %TYPE 和 %ROWTYPE 實(shí)現(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 || '的工號(hào)是:' || 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 || '的工號(hào)是:' || v_EMP.EMPNO || '崗位是:' || v_EMP.JOB); END;
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
將Oracle數(shù)據(jù)庫(kù)中的數(shù)據(jù)寫(xiě)入Excel
本文主要分享了將Oracle數(shù)據(jù)庫(kù)中的數(shù)據(jù)寫(xiě)入Excel的關(guān)鍵代碼。具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧2016-12-12Oracle占用內(nèi)存過(guò)高的問(wèn)題及解決
這篇文章主要介紹了Oracle占用內(nèi)存過(guò)高的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-1211g Oracle導(dǎo)出表不導(dǎo)出數(shù)據(jù)默認(rèn)為空表的解決方法
11g Oracle導(dǎo)出表 默認(rèn)不導(dǎo)出數(shù)據(jù)為空的表解決2014-07-07Windows Sever 2012下Oracle 12c安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了Windows Sever 2012下Oracle 12c安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Oracle數(shù)據(jù)庫(kù)中ora-12899錯(cuò)誤的解決方法
大家在使用oracle數(shù)據(jù)庫(kù)時(shí),經(jīng)常會(huì)遇到各種各樣的問(wèn)題,其中ORA-12899就是前段時(shí)間我在將數(shù)據(jù)導(dǎo)入到我本地機(jī)器上的時(shí)候一直出現(xiàn)的問(wèn)題.經(jīng)過(guò)一番倒騰問(wèn)題順利解決,下面小編把實(shí)現(xiàn)思路分享到腳本之家平臺(tái)大家可以參考下2017-11-11ORACLE 常用函數(shù)總結(jié)(80個(gè))
ORACLE 常用函數(shù)總結(jié)(80個(gè)),大家可以參考下。2009-09-09