2016年4月7日 星期四

&、DEFINE、ACCEPT (DML 十三)

互動變數並不是Oracle SQL裡,是在一本叫SQL*PlusR User's Guide and Reference裡面
這篇的最後一張圖,去官網往下拉一點就會看到

首先要啟用互動變數的功能,其實預設已經啟用,但我不確定每個版本都預設啟用
官網有說明,我的這篇PL/SQL也有講到一些,如果不懂PL/SQL就看截圖就好,這篇就不截圖了

只要打&xxx,xxx自己隨便取,放在SQL的任何地方都可以,反正就是個字串,一執行就會跳出畫面,這時你打什麼就是什麼,但如果沒啟用就會出「ORA-01008: 部分變數未被連結」的錯誤



※啟用/停用 換符號

SET DEFINE ON/OFF;
SELECT * FROM emp where deptno = &p1;
    
SET DEFINE &c;

※第一行就是啟用/停用,第二行就可以用了,預設要用「&」

※如果不想用預設的「&」,那就打最後一行,一打會跳出視窗,你輸入什麼就用什麼

※官網的DEF[INE]表示打DEF和DEFINE都可以,「[]」不是必要的,下面介紹的語法還有很多都是這樣



※&、&&

SELECT * FROM emp where deptno = &p1;
SELECT * FROM emp where deptno = &&p1;

※第一行每次執行都要打一次

※第二行打一次就可以執行很多次,如果要清除下面會介紹

※第二行的變數名稱和第一行一樣,所以執行過第二行,第一行的變數值也有值了,就不會再跳出畫面了



※清除

SELECT &p, sum(sal) FROM emp GROUP BY &p;
SELECT &&p, sum(sal) FROM emp GROUP BY &p;

※第一行兩個變數一樣,但要打兩次,所以改成第二行的寫法

※第二行的&&要寫在前面,後面的變數才知道不用再打了

※變數存起來只是暫時的,重登入就消失了,或者執行以下的語法
UNDEFINE p;
    
UNDEFINE p p1;

※第一行清除一個變數的值

※第二行是要清除多個變數,中間用空格隔開



※DEFINE

DEFINE xxx = 20;
SELECT * FROM emp WHERE deptno = &xxx;

※除了用「&」,也可以用DEFINE,看官網介紹



※ACCEPT

前本介紹的互動還不夠好,ACCEPT可以有文字,看官網介紹
語法如下:
ACC[EPT] variable [NUM[BER] | CHAR | DATE | BINARY_FLOAT | BINARY_DOUBLE] [FOR[MAT] format] [DEF[AULT] default] [PROMPT text|NOPR[OMPT]] [HIDE]


--1
ACCEPT yyy DATE FOR 'YYYY-MM-DD' NOPROMPT
SELECT * FROM emp WHERE hiredate < to_date('&yyy', 'YYYY-MM-DD');
    
--2
ACCEPT xxx DEFAULT 30 PROMPT '請輸入部門編號:'
SELECT * FROM emp WHERE deptno = &xxx;
    
--3
ACCEPT ooo FORMAT A2 PROMPT '請輸入部門編號:' HIDE
SELECT * FROM emp WHERE deptno = &ooo;

※第一組的NOPROMPT(NOPROMPT不寫也是一樣)和上面介紹的一樣,沒有文字訊息
但這一組有設定日期的格式

※第二組有預設值,但跳出的視窗有確定和取消,要按確定才有用

※第三組後本有個HIDE,表示打出來的字變成「*」號

沒有留言:

張貼留言