您好,登錄后才能下訂單哦!
此文檔介紹兩個事情,一個是替代變量,另一個就是了解一下硬解析和軟解析對于變量來說declare定義的好還是variable定義的好 在oracle 中,對于一個提交的sql語句,存在兩種可選的解析過程, 一種叫做硬解析,一種叫做軟解析.一個硬解析需要經解析,制定執行路徑,優化訪問計劃等許多的步驟.硬解釋不僅僅耗費大量的cpu,更重要的是會占據重要的們閂(latch)資源,嚴重的影響系統的規模的擴大(即限制了系統的并發行),而且引起的問題不能通過增加內存條和cpu的數量來解決。之所以這樣是因為門閂是為了順序訪問以及修改一些內存區域而設置的,這些內存區域是不能被同時修改。當一個sql語句提交后,oracle會首先檢查一下共享緩沖池(shared pool)里有沒有與之完全相同的語句,如果有的話只須執行軟分析即可,否則就得進行硬分析。 而唯一使得oracle 能夠重復利用執行計劃的方法就是采用綁定變量。綁定變量的實質就是用于替代sql語句中的常量的替代變量。綁定變量能夠使得每次提交的sql語句都完全一樣。 連接 前兩天看到有人在pub上問在sqlplus中通過define和variable定義的變量的區別。其實define定義的我 理解不是變量而是字符常量,通過define定義之后,在通過&或者&&引用的時候不需要輸入了,僅此而已。 oracle在執行的時候自動用值進行了替換;而variable定義的是綁定變量,上面已經提到。 綁定變量引用的時候用":" ,替代變量引用的時候用"&"; 綁定變量初始化 exec :num1:=2,替代變量默認類型為char 替換變量(僅用于SQL *Plus或者用于原理和SQL *Plus相同的開發工具): 臨時存儲值 利用它可以達到創建通用腳本的目的 利用它可以達到和用戶交互,故在SQL *Plus中又稱交互式命令 替換變量的格式式在變量名稱前加一個&,以便在運行SQL命令時提示用戶輸入替換數據,然后按輸入數據運行SQL命令 語法: (1)& :“&變量名”eg:&name; 生命周期:單次引用中,不需要聲明,如果替換字符或日期類型,最好用單引號擴起 使用范圍:where、order by、列表達式、表名、整個SELECT 語句中 www.2cto.com (2)&& :“&&變量名”eg:&&name; 生命周期:整個會話(session連接),不需要聲明 (3)define :“define 變量名=變量值”eg:DEFINE a = clark; 生命周期:整個會話,預先聲明,使用時用&引用聲明的變量 define variable=用戶創建的CHAR類型的值:define 變量名=值; define 變量名:查看變量命令。 undefine 變量名:清除變量 define:查看在當前會話中所有的替換變量和它們的值 (4)accept 生命周期:整個會話 預先聲明,可以客戶化提示信息,使用時用&引用聲明的變量。 定義: accept 變量名name number/char/date prompt '提示信息內容'即:ACC[EPT] variable [NUM[BER] | CHAR | DATE] [FOR[MAT] format] [DEF[AULT] default] [PROMPT text | NOPR[OMPT]] [HIDE] 解釋: PROMPT命令:用于輸出提示用戶的信息,以便使用戶了解腳本文件的功能和運行情況 PAUSE命令:用于暫停腳本文件的運行 HIDE選項:用于隱藏用戶的輸入,使別人不可見,安全 這條命令的意思是:當plsql程序段執行到變量name的時候,此時需要用戶的交互才能繼續執行下去,plsql程序段會顯示“提示信息內容”讓用戶輸入相關信息(如果指定hide選項,那么在接下去用戶輸入的東西將被用星號顯示出來增加安全,有點像輸入密碼),用戶輸入的內容被接收到并且把它付給name,關于在“提示信息內容”下用戶輸入的內容的類型,plsql程序段開發人員來通過number/char/date指定,變量name得到正確的值以后,繼續執行相關下面的程序! 例:accept a char prompt '請輸入員工的雇傭時間(yyyy-mm-dd):' hide 例:accept a char prompt 'input a:' hide www.2cto.com set verify on/off; #verify:是否給出原值及新值提示。 具體請參看下面的例子: 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的一個會話中先執行程序2,再次執行程序1,會發現直接PL/SQL procedure successfully completed. 而不讓我輸入ename,將set verify off也不行 另一個打開會話 將set verify off后,每次執行程序1都會讓你輸入ename。 這就是在前面一個會話執行程序2的時候已經將ename,保存為了會話的變量,而不是plsql程序的變量。 另外一個案例完整的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 '編號 #: ' 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;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。