新聞中心
這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
oracle中關(guān)于替代變量,accpt,綁定變量,字符變量
此文檔介紹兩個(gè)事情,一個(gè)是替代變量,另一個(gè)就是了解一下硬解析和軟解析對(duì)于變量來(lái)說(shuō)declare定義的好還是variable定義的好 在oracle 中,對(duì)于一個(gè)提交的sql語(yǔ)句,存在兩種可選的解析過(guò)程, 一種叫做硬解析,一種叫做軟解析.一個(gè)硬解析需要經(jīng)解析,制定執(zhí)行路徑,優(yōu)化訪問(wèn)計(jì)劃等許多的步驟.硬解釋不僅僅耗費(fèi)大量的cpu,更重要的是會(huì)占據(jù)重要的們閂(latch)資源,嚴(yán)重的影響系統(tǒng)的規(guī)模的擴(kuò)大(即限制了系統(tǒng)的并發(fā)行),而且引起的問(wèn)題不能通過(guò)增加內(nèi)存條和cpu的數(shù)量來(lái)解決。之所以這樣是因?yàn)殚T閂是為了順序訪問(wèn)以及修改一些內(nèi)存區(qū)域而設(shè)置的,這些內(nèi)存區(qū)域是不能被同時(shí)修改。當(dāng)一個(gè)sql語(yǔ)句提交后,oracle會(huì)首先檢查一下共享緩沖池(shared pool)里有沒(méi)有與之完全相同的語(yǔ)句,如果有的話只須執(zhí)行軟分析即可,否則就得進(jìn)行硬分析。 而唯一使得oracle 能夠重復(fù)利用執(zhí)行計(jì)劃的方法就是采用綁定變量。綁定變量的實(shí)質(zhì)就是用于替代sql語(yǔ)句中的常量的替代變量。綁定變量能夠使得每次提交的sql語(yǔ)句都完全一樣。 連接 前兩天看到有人在pub上問(wèn)在sqlplus中通過(guò)define和variable定義的變量的區(qū)別。其實(shí)define定義的我 理解不是變量而是字符常量,通過(guò)define定義之后,在通過(guò)&或者&&引用的時(shí)候不需要輸入了,僅此而已。 oracle在執(zhí)行的時(shí)候自動(dòng)用值進(jìn)行了替換;而variable定義的是綁定變量,上面已經(jīng)提到。 綁定變量引用的時(shí)候用":" ,替代變量引用的時(shí)候用"&"; 綁定變量初始化 exec :num1:=2,替代變量默認(rèn)類型為char 替換變量(僅用于SQL *Plus或者用于原理和SQL *Plus相同的開(kāi)發(fā)工具): 臨時(shí)存儲(chǔ)值 利用它可以達(dá)到創(chuàng)建通用腳本的目的 利用它可以達(dá)到和用戶交互,故在SQL *Plus中又稱交互式命令 替換變量的格式式在變量名稱前加一個(gè)&,以便在運(yùn)行SQL命令時(shí)提示用戶輸入替換數(shù)據(jù),然后按輸入數(shù)據(jù)運(yùn)行SQL命令 語(yǔ)法: (1)& :“&變量名”eg:&name; 生命周期:?jiǎn)未我弥校恍枰暶鳎绻鎿Q字符或日期類型,最好用單引號(hào)擴(kuò)起 使用范圍:where、order by、列表達(dá)式、表名、整個(gè)SELECT 語(yǔ)句中 www.2cto.com (2)&& :“&&變量名”eg:&&name; 生命周期:整個(gè)會(huì)話(session連接),不需要聲明 (3)define :“define 變量名=變量值”eg:DEFINE a = clark; 生命周期:整個(gè)會(huì)話,預(yù)先聲明,使用時(shí)用&引用聲明的變量 define variable=用戶創(chuàng)建的CHAR類型的值:define 變量名=值; define 變量名:查看變量命令。 undefine 變量名:清除變量 define:查看在當(dāng)前會(huì)話中所有的替換變量和它們的值 (4)accept 生命周期:整個(gè)會(huì)話 預(yù)先聲明,可以客戶化提示信息,使用時(shí)用&引用聲明的變量。 定義: accept 變量名name number/char/date prompt '提示信息內(nèi)容'即:ACC[EPT] variable [NUM[BER] | CHAR | DATE] [FOR[MAT] format] [DEF[AULT] default] [PROMPT text | NOPR[OMPT]] [HIDE] 解釋: PROMPT命令:用于輸出提示用戶的信息,以便使用戶了解腳本文件的功能和運(yùn)行情況 PAUSE命令:用于暫停腳本文件的運(yùn)行 HIDE選項(xiàng):用于隱藏用戶的輸入,使別人不可見(jiàn),安全 這條命令的意思是:當(dāng)plsql程序段執(zhí)行到變量name的時(shí)候,此時(shí)需要用戶的交互才能繼續(xù)執(zhí)行下去,plsql程序段會(huì)顯示“提示信息內(nèi)容”讓用戶輸入相關(guān)信息(如果指定hide選項(xiàng),那么在接下去用戶輸入的東西將被用星號(hào)顯示出來(lái)增加安全,有點(diǎn)像輸入密碼),用戶輸入的內(nèi)容被接收到并且把它付給name,關(guān)于在“提示信息內(nèi)容”下用戶輸入的內(nèi)容的類型,plsql程序段開(kāi)發(fā)人員來(lái)通過(guò)number/char/date指定,變量name得到正確的值以后,繼續(xù)執(zhí)行相關(guān)下面的程序! 例:accept a char prompt '請(qǐng)輸入員工的雇傭時(shí)間(yyyy-mm-dd):' hide 例:accept a char prompt 'input a:' hide www.2cto.com set verify on/off; #verify:是否給出原值及新值提示。 具體請(qǐng)參看下面的例子: plsql程序1: [sql] declare v_sal number(6,2); v_ename emp.ename%type:='&ename'; begin select sal into v_sal from emp where lower(ename)=lower(v_ename); if v_sal<2000 then update emp set sal=v_sal + 200 where lower(ename)=lower(v_ename); end if; end; / plsql程序2: [sql] declare v_sal number(6,2); v_ename emp.ename%type:='&&ename'; begin select sal into v_sal from emp where lower(ename)=lower(v_ename); if v_sal<2000 then update emp set sal=v_sal + 200 where lower(ename)=lower(v_ename); end if; www.2cto.com end; / secureCRT的一個(gè)會(huì)話中先執(zhí)行程序2,再次執(zhí)行程序1,會(huì)發(fā)現(xiàn)直接PL/SQL procedure successfully completed. 而不讓我輸入ename,將set verify off也不行 另一個(gè)打開(kāi)會(huì)話 將set verify off后,每次執(zhí)行程序1都會(huì)讓你輸入ename。 這就是在前面一個(gè)會(huì)話執(zhí)行程序2的時(shí)候已經(jīng)將ename,保存為了會(huì)話的變量,而不是plsql程序的變量。 另外一個(gè)案例完整的accept例子 CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7, 2), COMM NUMBER(7, 2), DEPTNO NUMBER(2)); INSERT INTO EMP VALUES (7369, 'SMITH', 'CLERK', 7902, TO_DATE('23-12-2013', 'DD-MM-YYYY'), 800, NULL, 20); INSERT INTO EMP VALUES (7499, 'ALLEN', 'SALESMAN', 7698, TO_DATE('20-02-1981', 'DD-MM-YYYY'), 1600, 300, 30); INSERT INTO EMP VALUES (7521, 'WARD', 'SALESMAN', 7698, TO_DATE('22-02-1981', 'DD-MM-YYYY'), 1250, 500, 30); INSERT INTO EMP VALUES (7566, 'JONES', 'MANAGER', 7839, TO_DATE('22-04-1981', 'DD-MM-YYYY'), 2975, NULL, 20); INSERT INTO EMP VALUES (7654, 'MARTIN', 'SALESMAN', 7698,TO_DATE('28-09-1981', 'DD-MM-YYYY'), 1250, 1400, 30); INSERT INTO EMP VALUES (7698, 'BLAKE', 'MANAGER', 7839,TO_DATE('01-03-1981', 'DD-MM-YYYY'), 2850, NULL, 30); INSERT INTO EMP VALUES (7782, 'CLARK', 'MANAGER', 7839,TO_DATE('09-05-1981', 'DD-MM-YYYY'), 2450, NULL, 10); INSERT INTO EMP VALUES (7788, 'SCOTT', 'ANALYST', 7566,TO_DATE('09-12-1982', 'DD-MM-YYYY'), 3000, NULL, 20); INSERT INTO EMP VALUES (7839, 'KING', 'PRESIDENT', NULL,TO_DATE('17-11-1981', 'DD-MM-YYYY'), 5000, NULL, 10); INSERT INTO EMP VALUES (7844, 'TURNER', 'SALESMAN', 7698,TO_DATE('08-09-1981', 'DD-MM-YYYY'), 1500, 0, 30); INSERT INTO EMP VALUES (7876, 'ADAMS', 'CLERK', 7788,TO_DATE('12-06-1983', 'DD-MM-YYYY'), 1100, NULL, 20); INSERT INTO EMP VALUES (7900, 'JAMES', 'CLERK', 7698,TO_DATE('13-12-1981', 'DD-MM-YYYY'), 950, NULL, 30); INSERT INTO EMP VALUES (7902, 'FORD', 'ANALYST', 7566,TO_DATE('13-12-1981', 'DD-MM-YYYY'), 3000, NULL, 20); INSERT INTO EMP VALUES (7934, 'MILLER', 'CLERK', 7782,TO_DATE('23-03-1982', 'DD-MM-YYYY'), 1300, NULL, 10); prompt C R E A T E N E W E M P L O Y E E R E C O R D prompt prompt Enter the employee's information: prompt accept l_ename char format a10 prompt '名字: ' accept l_empno number format '9999' prompt '編號(hào) #: ' accept l_sal number format '99999.99' prompt 'Salary [1000]: ' default '1000.00' accept l_comm number format '99999.99' prompt 'Commission % [0]: ' default '0' accept l_hired date format 'mm/dd/yyyy' prompt 'Hire date (mm/dd/yyyy): ' prompt List of available jobs: select distinct job from emp order by job / accept l_job char format a9 prompt 'Job: ' prompt List of managers and employee numbers: select empno, ename from emp order by ename / accept l_mgr number format '9999' prompt 'Manager''s Employee #: ' prompt List of department numbers and names: select deptno, dname from dept order by deptno / accept l_dept number format '99' prompt 'Department #: ' insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (&l_empno, '&l_ename', '&l_job', &l_mgr, to_date('&l_hired','mm/dd/yyyy'), &l_sal, &l_comm, &l_dept) / select * from emp where empno=&l_empno / drop table emp;
分享題目:oracle中關(guān)于替代變量,accpt,綁定變量,字符變量
URL鏈接:http://www.ef60e0e.cn/article/jehgcg.html