ORACLE 繫結變數用法總結

quanjima發表於2014-11-12

之前對ORACLE中的變數一直沒個太清楚的認識,比如說使用:、&、&&、DEIFINE、VARIABLE……等等。今天正好閒下來,上網搜了搜相關的文章,彙總了一下,貼在這裡,方便學習。

 

==================================================================================

 

 oracle 中,對於一個提交的sql語句,存在兩種可選的解析過程一種叫做硬解析,一種叫做軟解析.

一個硬解析需要經解析,制定執行路徑,最佳化訪問計劃等許多的步驟.硬解釋不僅僅耗費大量的cpu,更重要的是會佔據重要的們閂(latch)資源,嚴重的影響系統的規模的擴大(即限制了系統的併發行),而且引起的問題不能透過增加記憶體條和cpu的數量來解決。之所以這樣是因為門閂是為了順序訪問以及修改一些記憶體區域而設定的,這些記憶體區域是不能被同時修改。當一個sql語句提交後,oracle會首先檢查一下共享緩衝池(shared pool)裡有沒有與之完全相同的語句,如果有的話只須執行軟分析即可,否則就得進行硬分析。

 而唯一使得oracle 能夠重複利用執行計劃的方法就是採用繫結變數。繫結變數的實質就是用於替代sql語句中的常量的替代變數。繫結變數能夠使得每次提交的sql語句都完全一樣。

 

1.


sqlplus中如何使用繫結變數,可以透過variable來定義

[c-sharp] view plaincopy
  1. SQL> select * from tt where id=1;  
  2.   
  3. ID NAME  
  4. ---------- ----------------------------------------  
  5. 1 test  
  6.   
  7. SQL> select * from tt where id=2;  
  8.   
  9. ID NAME  
  10. ---------- ----------------------------------------  
  11. 2 test  
  12.   
  13. SQL> variable i number;  
  14. SQL> exec :i :=1;  
  15.   
  16. PL/SQL 過程已成功完成。  
  17.   
  18. SQL> select *from tt where id=:i;  
  19.   
  20. ID NAME  
  21. ---------- ----------------------------------------  
  22. 1 test  
  23.   
  24. SQL> exec :i :=2;  
  25.   
  26. PL/SQL 過程已成功完成。  
  27.   
  28. SQL> select *from tt where id=:i;  
  29.   
  30. ID NAME  
  31. ---------- ----------------------------------------  
  32. 2 test  
  33.   
  34. SQL> print i;  
  35.   
  36. I  
  37. ----------  
  38. 2  
  39.   
  40. SQL> select sql_text,parse_calls from v$sql where sql_text like 'select * from t  
  41. t where id=%';  
  42.   
  43. SQL_TEXT PARSE_CALLS  
  44. ------------------------------------------------------------ -----------  
  45. select * from tt where id=2 1  
  46. select * from tt where id=1 1  
  47. select * from tt where id=:i 2  
  48. SQL>  

從上面試驗發現繫結變數i的使用使查詢id=1id=2sqlselect *from tt where id=:i得以重複
使用,從而避免了hard parse,這裡的PARSE_CALLS2包括了一次soft parse




2.

前兩天看到有人在pub上問sqlplus中透過definevariable定義的變數的區別。其實define定義的我

理解不是變數而是字元常量,透過define定義之後,在透過&或者&&引用的時候不需要輸入了,僅此而已。

oracle
在執行的時候自動用值進行了替換;而variable定義的是繫結變數,上面已經提到。

[c-sharp] view plaincopy
  1. C:>sqlplus xys/manager  
  2. SQL*Plus: Release 11.1.0.6.0 - Production on 星期二 4月 1 14:03:00 2008  
  3. Copyright (c) 1982, 2007, Oracle. All rights reserved.  
  4.   
  5. 連線到:  
  6. Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production  
  7. With the Partitioning, OLAP, Data Mining and Real Application Testing options  
  8. SQL> define  
  9. DEFINE _DATE = "01-4月 -08" (CHAR)  
  10. DEFINE _CONNECT_IDENTIFIER = "db11" (CHAR)  
  11. DEFINE _USER = "XYS" (CHAR)  
  12. DEFINE _PRIVILEGE = "" (CHAR)  
  13. DEFINE _SQLPLUS_RELEASE = "1101000600" (CHAR)  
  14. DEFINE _EDITOR = "Notepad" (CHAR)  
  15. DEFINE _O_VERSION = "Oracle Database 11g Enterprise Edition Release 11.1.0.  
  16. 6.0 - Production  
  17. With the Partitioning, OLAP, Data Mining and Real Application Testing options" (  
  18. CHAR)  
  19. DEFINE _O_RELEASE = "1101000600" (CHAR)  
  20. SQL> select *from tt;  
  21. ID NAME  
  22. ---------- ----------  
  23. 1 a  
  24. 2 a  
  25. 3 "abc"  
  26. SQL> define a  
  27. SP2-0135: 符號 a 未定義  
  28. SQL> define a=1  
  29. SQL> define  
  30. DEFINE _DATE = "01-4月 -08" (CHAR)  
  31. DEFINE _CONNECT_IDENTIFIER = "db11" (CHAR)  
  32. DEFINE _USER = "XYS" (CHAR)  
  33. DEFINE _PRIVILEGE = "" (CHAR)  
  34. DEFINE _SQLPLUS_RELEASE = "1101000600" (CHAR)  
  35. DEFINE _EDITOR = "Notepad" (CHAR)  
  36. DEFINE _O_VERSION = "Oracle Database 11g Enterprise Edition Release 11.1.0.  
  37. 6.0 - Production  
  38. With the Partitioning, OLAP, Data Mining and Real Application Testing options" (CHAR)  
  39. DEFINE _O_RELEASE = "1101000600" (CHAR)  
  40. DEFINE A = "1" (CHAR)  
  41. --透過上面顯示define定義的應該是字元(串)常量。  
  42. SQL> select * from tt where id=&a;  
  43. 原值 1: select * from tt where id=&a  
  44. 新值 1: select * from tt where id=1  
  45. ID NAME  
  46. ---------- ----------  
  47. 1 a  
  48. SQL> select * from tt where id=&&a;  
  49. 原值 1: select * from tt where id=&&a  
  50. 新值 1: select * from tt where id=1  
  51. ID NAME  
  52. ---------- ----------  
  53. 1 a  
  54. SQL> define b='a';  
  55. SQL> define  
  56. DEFINE _DATE = "01-4月 -08" (CHAR)  
  57. DEFINE _CONNECT_IDENTIFIER = "db11" (CHAR)  
  58. DEFINE _USER = "XYS" (CHAR)  
  59. DEFINE _PRIVILEGE = "" (CHAR)  
  60. DEFINE _SQLPLUS_RELEASE = "1101000600" (CHAR)  
  61. DEFINE _EDITOR = "Notepad" (CHAR)  
  62. DEFINE _O_VERSION = "Oracle Database 11g Enterprise Edition Release 11.1.0.  
  63. 6.0 - Production  
  64. With the Partitioning, OLAP, Data Mining and Real Application Testing options" (  
  65. CHAR)  
  66. DEFINE _O_RELEASE = "1101000600" (CHAR)  
  67. DEFINE A = "1" (CHAR)  
  68. DEFINE B = "a" (CHAR)  
  69.   
  70. --如果是字元型別那麼在引用時別忘了加上單引號,另外透過define定義之後在引用時不需要輸入了。  
  71. SQL> select * from tt where name=&&b;  
  72. 原值 1: select * from tt where name=&&b  
  73. 新值 1: select * from tt where name=a  
  74. select * from tt where name=a  
  75. *  
  76. 第 1 行出現錯誤:  
  77. ORA-00904: "A": 識別符號無效  
  78.   
  79. SQL> select * from tt where name='&&b';  
  80. 原值 1: select * from tt where name='&&b'  
  81. 新值 1: select * from tt where name='a'  
  82. ID NAME  
  83. ---------- ----------  
  84. 1 a  
  85. 2 a  
  86. SQL> select * from tt where name='&b';  
  87. 原值 1: select * from tt where name='&b'  
  88. 新值 1: select * from tt where name='a'  
  89. ID NAME  
  90. ---------- ----------  
  91. 1 a  
  92. 2 a  
  93. --執行sql時進行了替換  
  94. SQL> select sql_text from v$sql where sql_text like 'select * from tt where name  
  95. =%';  
  96. SQL_TEXT  
  97. --------------------------------------------------------------------------------  
  98. select * from tt where name=1  
  99. select * from tt where name='a'  
  100. SQL>  


3.

oracle在解析sql時會把plsql中定義的變數轉為為繫結變數

[c-sharp] view plaincopy
  1. SQL> create table tt(id int , name varchar2(10));  
  2.   
  3. 表已建立。  
  4.   
  5. SQL> alter session set sql_trace=true;  
  6.   
  7. 會話已更改。  
  8.   
  9. SQL> declare  
  10. 2 begin  
  11. 3 for i in 1..100 loop  
  12. 4 insert into tt values(i,'test');  
  13. 5 end loop;  
  14. 6 commit;  
  15. 7 end;  
  16. 8 /  
  17.   
  18. PL/SQL 過程已成功完成。  
  19.   
  20. SQL> alter session set sql_trace=false;  
  21. --trace file:  
  22. =====================  
  23. PARSING IN CURSOR #3 len=90 dep=0 uid=31 oct=47 lid=31 tim=7109565004 hv=962259239   
  24.   
  25. ad='668ec528'  
  26. declare  
  27. begin  
  28. for i in 1..100 loop  
  29. insert into tt values(i,'test');  
  30. end loop;  
  31. commit;  
  32. end;  
  33. END OF STMT  
  34. PARSE #3:c=15625,e=5678,p=0,cr=3,cu=0,mis=1,r=0,dep=0,og=1,tim=7109564996  
  35. =====================  
  36. PARSING IN CURSOR #5 len=34 dep=1 uid=31 oct=2 lid=31 tim=7109565520 hv=1299226876   
  37.   
  38. ad='66869934'  
  39. INSERT INTO TT VALUES(:B1 ,'test')  
  40. END OF STMT  
  41. PARSE #5:c=0,e=226,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=1,tim=7109565513  
  42. =====================  

另外從hard parse的資料量上其實也可以大致猜測oracle會把plsql中定義的變數轉換為繫結變數處理
[c-sharp] view plaincopy
  1. SQL> connect /as sysdba  
  2. 已連線。  
  3. SQL> shutdown immediate  
  4. 資料庫已經關閉。  
  5. 已經解除安裝資料庫。  
  6. ORACLE 例程已經關閉。  
  7. SQL> startup  
  8. ORACLE 例程已經啟動。  
  9.   
  10. Total System Global Area 167772160 bytes  
  11. Fixed Size 1247900 bytes  
  12. Variable Size 67110244 bytes  
  13. Database Buffers 96468992 bytes  
  14. Redo Buffers 2945024 bytes  
  15. 資料庫裝載完畢。  
  16. 資料庫已經開啟。  
  17. SQL> connect xys/manager  
  18. 已連線。  
  19. SQL> drop table tt;  
  20.   
  21. 表已刪除。  
  22.   
  23. SQL> create table tt(id int , name varchar2(10));  
  24.   
  25. 表已建立。  
  26. SQL> col name format a30  
  27. SQL> select a.*,b.name  
  28. 2 from v$sesstat a , v$statname b  
  29. 3 where a.statistic#=b.statistic#  
  30. 4 and a.sid=(select distinct sid from v$mystat)  
  31. 5 and b.name like '%parse%';  
  32.   
  33. SID STATISTIC# VALUE NAME  
  34. ---------- ---------- ---------- ------------------------------  
  35. 159 328 39 parse time cpu  
  36. 159 329 74 parse time elapsed  
  37. 159 330 339 parse count (total)  
  38. 159 331 165 parse count (hard)  
  39. 159 332 0 parse count (failures)  
  40.   
  41. SQL> declare  
  42. 2 begin  
  43. 3 for i in 1..100 loop  
  44. 4 insert into tt values(i,'test');  
  45. 5 end loop;  
  46. 6 commit;  
  47. 7 end;  
  48. 8 /  
  49.   
  50. PL/SQL 過程已成功完成。  
  51.   
  52. SQL> select a.*,b.name  
  53. 2 from v$sesstat a , v$statname b  
  54. 3 where a.statistic#=b.statistic#  
  55. 4 and a.sid=(select distinct sid from v$mystat)  
  56. 5 and b.name like '%parse%'  
  57. 6 /  
  58.   
  59. SID STATISTIC# VALUE NAME  
  60. ---------- ---------- ---------- ------------------------------  
  61. 159 328 39 parse time cpu  
  62. 159 329 74 parse time elapsed  
  63. 159 330 345 parse count (total)  
  64. 159 331 167 parse count (hard)  
  65. 159 332 0 parse count (failures)  
  66.   
  67. SQL>  


這裡發現hard parse只增加了2,如果沒有使用繫結變數的話,相信hard parse會更多

4.

過程中的引數會自動轉化為繫結變數

[c-sharp] view plaincopy
  1. SQL> edit  
  2. 已寫入 file afiedt.buf  
  3.   
  4. 1 create or replace procedure proc_test(p_id int, p_name varchar2)  
  5. 2 is  
  6. 3 begin  
  7. 4 insert into tt values(p_id , p_name);  
  8. 5 commit;  
  9. 6* end;  
  10. SQL> /  
  11.   
  12. 過程已建立。  
  13.   
  14. SQL> alter session set sql_trace=true;  
  15.   
  16. 會話已更改。  
  17.   
  18. SQL> exec proc_test(200,'test');  
  19.   
  20. PL/SQL 過程已成功完成。  
  21.   
  22. SQL> alter session set sql_trace=false;  
  23.   
  24. 會話已更改。  
  25. --trace file:  
  26. alter session set sql_trace=true  
  27. END OF STMT  
  28. EXEC #3:c=0,e=749,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=7393908487  
  29. =====================  
  30. PARSING IN CURSOR #1 len=35 dep=0 uid=31 oct=47 lid=31 tim=7403000735 hv=526484776   
  31.   
  32. ad='6687b0b8'  
  33. BEGIN proc_test(200,'test'); END;  
  34. END OF STMT  
  35. PARSE #1:c=0,e=2584,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=7403000727  
  36. =====================  
  37. PARSING IN CURSOR #6 len=33 dep=1 uid=31 oct=2 lid=31 tim=7403001293 hv=2874748229   
  38.   
  39. ad='668e9cd8'  
  40. INSERT INTO TT VALUES(:B2 , :B1 )  
  41. END OF STMT  
  42. PARSE #6:c=0,e=246,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=1,tim=7403001286  
  43. =====================  


另外也可以直觀的觀察:

[c-sharp] view plaincopy
  1. SQL> exec proc_test(200,'test');  
  2.   
  3. PL/SQL 過程已成功完成。  
  4.   
  5. SQL> select sql_text from v$sql where sql_text like '%proc_test%';  
  6.   
  7. SQL_TEXT  
  8. --------------------------------------------------------------------------------  
  9. BEGIN proc_test(200,'test'); END;  
  10.   
  11. SQL>  


sqlplus裡執行過程不能觀察出來
下面在plsql developer執行一次過程之後再來看執行的情況

[c-sharp] view plaincopy
  1. SQL> select sql_text from v$sql where sql_text like '%proc_test%';  
  2.   
  3. SQL_TEXT  
  4. --------------------------------------------------------------------------------  
  5. begin -- Call the procedure proc_test(p_id =>:p_id, p_name =>:p_name); end;  
  6.   
  7. SQL>  


很顯然oracle在執行過程時把引數轉化為繫結變數了,其實從plsql developer中執行過程時的語法就能

看出來:

[c-sharp] view plaincopy
  1. begin  
  2. -- Call the procedure  
  3. proc_test(p_id => :p_id,  
  4. p_name => :p_name);  
  5. end;  

在輸入引數列表框上面的執行語法就是這樣的。


5.

在動態sql中使用繫結變數,動態sql中使用繫結變數非常明顯也容易理解,下面給出2個簡單的例子

[c-sharp] view plaincopy
  1. SQL> set serveroutput on  
  2. SQL> declare  
  3.    2   v_string varchar2(100);  
  4.    3   v_id tt.id%type ;  
  5.    4   v_name tt.name%type ;  
  6.    5   begin  
  7.    6   v_string:='select * from tt where id=:v_id';  
  8.    7   execute immediate v_string into v_id , v_name using &a;  
  9.    8   dbms_output.put_line(v_id||' '||v_name) ;  
  10.    9   end;  
  11. 10   /  
  12. 輸入 a 的值:   1  
  13. 原值 7: execute immediate v_string into v_id , v_name using &a;  
  14. 新值 7: execute immediate v_string into v_id , v_name using 1;  
  15. 1 test  
  16.   
  17. PL/SQL 過程已成功完成。  
  18.   
  19. SQL> declare  
  20.    2   v_string varchar2(100);  
  21.    3   v_id tt.id%type;  
  22.    4   v_name tt.name%type ;  
  23.    5   begin  
  24.    6   v_string:='insert into tt values(:id,:name)';  
  25.    7   execute immediate v_string using &id,&name ;  
  26.    8   end;  
  27.    9   /  
  28. 輸入 id 的值:   1000  
  29. 輸入 name 的值:   'test'  
  30. 原值 7: execute immediate v_string using &id,&name ;  
  31. 新值 7: execute immediate v_string using 1000,'test' ;  
  32.   
  33. PL/SQL 過程已成功完成。  
  34.   
  35. SQL> select * from tt where id=1000;  
  36.   
  37.        ID NAME  
  38. ---------- ----------  
  39.    1000 test  
  40.   
  41. SQL>  
 


=============================下面加上一些其他變數的使用方法========================= 

eg001&替換變數)


[c-sharp] view plaincopy
  1. SQL> select xh,xm from system.xs where zym='&zym';  
  2. 輸入 zym 的值:  計算機  
  3. 原值    1: select xh,xm from system.xs where zym='&zym'  
  4. 新值    1: select xh,xm from system.xs where zym='計算機'  
  5.   
  6. XH     XM  
  7. ------ --------  
  8. 061101 王林  
  9. 061102 程明  
  10. 061103 王燕  
  11. 061104 韋嚴平  
  12. 061106 李方方  
  13. 061107 李明  
  14. 061108 林一帆  
  15. 061109 張強民  
  16. 061110 張蔚  
  17. 061111 趙琳  
  18. 061113 嚴紅  
  19.   
  20. 已選擇11行。  
  21.   
  22. SQL> edit  
  23. 已寫入 file afiedt.buf  
  24.   
  25.   1  select xh 學號,xm 姓名,avg(cj) as 平均成績  
  26.   2* from system.xs_xkb group by xh,xm  
  27. SQL> /  
  28.   
  29. 學號   姓名       平均成績  
  30. ------ -------- ----------  
  31. 061103 王燕             71  
  32. 061210 李紅慶           76  
  33. 061110 張蔚     91.3333333  
  34. 061220 吳薇華           82  
  35. 061104 韋嚴平   79.6666667  
  36. 061101 王林             78  
  37. 061204 馬林林           91  
  38. 061106 李方方           72  
  39. 061218 孫研             70  
  40. 061102 程明             78  
  41. 061241 羅林琳           90  
  42.   
  43. 學號   姓名       平均成績  
  44. ------ -------- ----------  
  45. 061111 趙琳           80.5  
  46. 061109 張強民         76.5  
  47. 061216 孫祥欣           81  
  48. 061221 劉燕敏           79  
  49.   
  50. 已選擇15行。  
  51.   
  52. SQL> select * from system.xs_xkb where cj>=&cj; /*替換變數可以使用WHERE子句;ORDER BY子句;列表示式;表名;整個SELECT語句*/  
  53. 輸入 cj 的值:  90  
  54. 原值    1: select * from system.xs_xkb where cj>=&cj  
  55. 新值    1: select * from system.xs_xkb where cj>=90  
  56.   
  57. SQL> select xs.xh,&name,kcm,&column  
  58.   2  from system.xs,&kc,system.xs_kc  
  59.   3  where xs.xh=xs_kc.xh and &condition  
  60.   4  and kcm=&kcm  
  61.   5  order by & column;  
  62. 輸入 name 的值:  xm  
  63. 輸入 column 的值:  cj  
  64. 原值    1: select xs.xh,&name,kcm,&column  
  65. 新值    1: select xs.xh,xm,kcm,cj  
  66. 輸入 kc 的值:  system.kc  
  67. 原值    2: from system.xs,&kc,system.xs_kc  
  68. 新值    2: from system.xs,system.kc,system.xs_kc  
  69. 輸入 condition 的值:  kc.kch=xs_kc.kch  
  70. 原值    3: where xs.xh=xs_kc.xh and &condition  
  71. 新值    3: where xs.xh=xs_kc.xh and kc.kch=xs_kc.kch  
  72. 輸入 kcm 的值:  '離散數學'  
  73. 原值    4: and kcm=&kcm  
  74. 新值    4: and kcm='離散數學'  
  75. 輸入 column 的值:  cj  
  76. 原值    5: order by & column  
  77. 新值    5: order by cj  
  78.   
  79. XH     XM       KCM                      CJ  
  80. ------ -------- ---------------- ----------  
  81. 061104 韋嚴平   離散數學                 65  
  82. 061109 張強民   離散數學                 70  
  83. 061101 王林     離散數學                 76  
  84. 061102 程明     離散數學                 78  
  85. 061106 李方方   離散數學                 80  
  86. 061103 王燕     離散數學                 81  
  87. 061110 張蔚     離散數學                 89  
  



eg002&&替換變數)


[c-sharp] view plaincopy
  1. --&&替換變數系統一直用同一個值處理,清除用undefine 變數名清除  
  2. SQL> edit  
  3. 已寫入 file afiedt.buf  
  4.   
  5.   1  select xs.xh,&name,kcm,&&column   /*清除替換變數(undefine column)*/  
  6.   2  from system.xs,&kc,system.xs_kc  
  7.   3  where xs.xh=xs_kc.xh and &condition  
  8.   4  and kcm=&kcm  
  9.   5* order by &column  
  10. SQL> /  
  11. 輸入 name 的值:  xm  
  12. 輸入 column 的值:  cj  
  13. 原值    1: select xs.xh,&name,kcm,&&column  
  14. 新值    1: select xs.xh,xm,kcm,cj  
  15. 輸入 kc 的值:  system.kc  
  16. 原值    2: from system.xs,&kc,system.xs_kc  
  17. 新值    2: from system.xs,system.kc,system.xs_kc  
  18. 輸入 condition 的值:  kc.kch=xs_kc.kch  
  19. 原值    3: where xs.xh=xs_kc.xh and &condition  
  20. 新值    3: where xs.xh=xs_kc.xh and kc.kch=xs_kc.kch  
  21. 輸入 kcm 的值:  '離散數學'  
  22. 原值    4: and kcm=&kcm  
  23. 新值    4: and kcm='離散數學'  
  24. 原值    5: order by &column             /*使用&&替換變數的好處,相同變數只輸第一次就OK*/  
  25. 新值    5: order by cj  
  26.   
  27. XH     XM       KCM                      CJ  
  28. ------ -------- ---------------- ----------  
  29. 061104 韋嚴平   離散數學                 65  
  30. 061109 張強民   離散數學                 70  
  31. 061101 王林     離散數學                 76  
  32. 061102 程明     離散數學                 78  
  33. 061106 李方方   離散數學                 80  
  34. 061103 王燕     離散數學                 81  
  35. 061110 張蔚     離散數學                 89  
  36.   
  37. 已選擇7行。  

eg003


DEFINE[variable[=value]]
UNDEFINE
清除定義的變數

[c-sharp] view plaincopy
  1. SQL> define specialty=通訊工程  
  2. SQL> define specialty  
  3. DEFINE SPECIALTY       = "通訊工程" (CHAR)  
  4. SQL> select xh,xm,xb,cssj,zxf from system.xs  
  5.   2  where zym='&specialty';  
  6.   
  7. XH     XM       XB CSSJ                  ZXF  
  8. ------ -------- -- -------------- ----------  
  9. 061202 王林     男 29-10月-85             40  
  10. 061210 李紅慶   女 01-5月 -85             44  
  11. 061201 王敏     男 10-6月 -84             42  
  12. 061203 王玉民   男 26-3月 -86             42  
  13. 061204 馬林林   女 10-2月 -84             42  
  14. 061206 李計     女 20-9月 -85             42  
  15. 061216 孫祥欣   女 09-3月 -84             42  
  16. 061218 孫研     男 09-10月-86             42  
  17. 061220 吳薇華   女 18-3月 -86             42  
  18. 061221 劉燕敏   女 12-11月-85             42  
  19. 061241 羅林琳   女 30-1月 -86             50  
  20.   
  21. 已選擇11行。  



eg004
ACCEPT variable[datatype[NUMBER|CHAR|DATE]][FORMAT format][PROMPT text][HIDE]
/*variable
:指定接收值的變數。該名稱的變數不存在,那麼SQL重建該變數;datatype:變數資料型別,預設為CHAR*/


[c-sharp] view plaincopy
  1. SQL> accept num prompt'請輸入課程號:'  
  2. 請輸入課程號:101  
  3. SQL> set verify on  
  4. SQL>   
  5.   1  select xh,kcm,cj from system.xs_kc,system.kc  
  6.   2  where xs_kc.kch=kc.kch and kc.kch='&num'  
  7.   3* order by cj  
  8. SQL> /  
  9. 原值    2: where xs_kc.kch=kc.kch and kc.kch='&num'  
  10. 新值    2: where xs_kc.kch=kc.kch and kc.kch='101'  
  11.   
  12. XH     KCM                      CJ  
  13. ------ ---------------- ----------  
  14. 061103 計算機基礎               62  
  15. 061106 計算機基礎               65  
  16. 061218 計算機基礎               70  
  17. 061210 計算機基礎               76  
  18. 061221 計算機基礎               79  
  19. 061101 計算機基礎               80  
  20. 061216 計算機基礎               81  
  21. 061220 計算機基礎               82  
  22. 061241 計算機基礎               90  
  23. 061104 計算機基礎               90  
  24. 061111 計算機基礎               91  
  25.   
  26. XH     KCM                      CJ  
  27. ------ ---------------- ----------  
  28. 061204 計算機基礎               91  
  29. 061110 計算機基礎               95  
  30.   
  31. 已選擇13行。  


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29913993/viewspace-1330235/,如需轉載,請註明出處,否則將追究法律責任。

相關文章