è¿éåªä»ç»å¨æSQLç使ç¨ãå
³äºå¨æSQLè¯å¥çè¯æ³ï¼åè§ï¼
http://blog.csdn.NET/chiclewu/article/details/160971331.ä»ä¹æ¯æ¶åéè¦ä½¿ç¨å¨æSQLï¼
SQLææ¬å¨ç¼è¯æ¶æ¯æªç¥çã
ä¾å¦ï¼SELECTè¯å¥å
å«çæ è¯ç¬¦(å¦è¡¨å)å¨ç¼è¯æ¶æ¯æªç¥çï¼æè
WHEREåå¥çæ¡ä»¶æ°éå¨ç¼è¯æ¶æ¯æªç¥ã
éæSQLä¸æ¯æ
ä¾å¦ï¼å¨PL/SQLä¸ç¨éæSQLåªè½æ§è¡æ¥è¯¢ä»¥åDMLè¯å¥ãå¦ææ³è¦æ§è¡DDLè¯å¥ï¼åªè½ä½¿ç¨å¨æSQLã
å½è®©ä½¿ç¨éæSQLï¼ä¹æå®ç好å¤ï¼
ç¼è¯æåéªè¯äºéæSQLè¯å¥å¼ç¨ææçæ°æ®åºå¯¹è±¡å访é®è¿äºå¯¹è±¡çæé
ç¼è¯æåå建äºæ¨¡å¼å¯¹è±¡çä¾èµå
³ç³»
2.EXECUTE IMMEDIATEè¯å¥
EXECUTE IMMEDIATEè¯å¥çæææ¯ä½¿ç¨æ¬å°å¨æSQLå¤ç大å¤æ°å¨æSQLè¯å¥ã
å¦æå¨æSQLè¯å¥æ¯èªå
å«çï¼ä¹å°±æ¯è¯´ï¼å®çç»å®åæ°æ²¡æå ä½ç¬¦ï¼å¹¶ä¸ç»æä¸å¯è½è¿åé误ï¼ï¼åEXECUTE IMMEDIATEè¯å¥ä¸éè¦åå¥ã
å¦æå¨æSQLè¯å¥å
è¡å ä½ç¬¦ç»å®åæ°ï¼æ¯ä¸ªå ä½ç¬¦å¨EXECUTE IMMEDIATEè¯å¥çåå¥ä¸å¿
é¡»æä¸ä¸ªç¸åºçç»å®åæ°ï¼å
·ä½å¦ä¸ï¼
å¦æå¨æSQLè¯å¥æ¯ä¸ä¸ªæå¤åªè½è¿åä¸è¡çSELECTè¯å¥ï¼OUTç»å®åæ°æ¾ç½®å¨INTOåå¥ï¼INç»å®åæ°æ¾ç½®å¨USINGåå¥ã
å¦æå¨æSQLè¯å¥æ¯ä¸ä¸ªå¯ä»¥è¿åå¤è¡çSELECTè¯å¥ï¼OUTç»å®åæ°æ¾ç½®å¨BULK COLLECT INTOåå¥ï¼INç»å®åæ°æ¾ç½®å¨USINGåå¥ã
å¦æå¨æSQLè¯å¥æ¯ä¸ä¸ªé¤äºSELECT以å¤çå
¶ä»DMLè¯å¥ï¼ä¸æ²¡æRETURNING INTOåå¥ï¼ææçç»å®åæ°æ¾ç½®å¨USINGåå¥ä¸ã
å¦æå¨æSQLè¿è¯å¥ä¸ä¸ªå¿åPL/SQLåæCALLè¯å¥ï¼æææçç»å®åæ°æ¾ç½®å¨USINGåå¥ä¸ã
å¦æå¨æSQLè¯å¥è°ç¨ä¸ä¸ªåç¨åºï¼è¯·ç¡®ä¿ï¼
æ¯ä¸ªå¯¹åºåç¨åºåæ°å ä½ç¬¦çç»å®åæ°ä¸åç¨åºåæ°å
·æç¸åçåæ°æ¨¡å¼åå
¼å®¹çæ°æ®ç±»åã
ç»å®åæ°ä¸è¦æSQLä¸æ¯æçæ°æ®ç±»åï¼ä¾å¦ï¼å¸å°ç±»å,å
³èæ°ç»ï¼ä»¥åç¨æ·èªå®çè®°å½ç±»åï¼
USINGåå¥ä¸è½å
å«NULLåé¢éãå¦ææ³è¦å¨USINGåå¥ä¸ä½¿ç¨NULLå¼ï¼å¯ä»¥ä½¿ç¨ä½åå§åçåéæè
å½æ°æ¾ç¤ºå°NULL转æ¢æä¸ä¸ªæç±»åçå¼ã
2.1å¨æSQLè¯å¥æ¯ä¸ä¸ªæå¤åªè½è¿åä¸è¡çSELECTè¯å¥
使ç¨å¨æSQLè¯å¥è¿åååï¼æ¥è¯¢SCOTTçèªæ°´ï¼
declare
v_sql_text varchar2(1000);
v_sal number;
v_ename emp.ename%type := 'SCOTT';
begin
v_sql_text := 'select e.sal from emp e where e.ename = :ename';
execute immediate v_sql_text
into v_sal
using v_ename;
dbms_output.put_line(v_ename || ':' || v_sal);
end;
使ç¨å¨æSQLè¿åä¸æ¡è®°å½ï¼æ¥è¯¢SCOTTçåºæ¬ä¿¡æ¯ï¼
declare
v_sql_text varchar2(1000);
v_ename emp.ename%type := 'SCOTT';
vrt_emp emp%rowtype;
begin
v_sql_text := 'select * from emp e where e.ename = :ename';
execute immediate v_sql_text
into vrt_emp
using v_ename;
dbms_output.put_line(v_ename || 'çåºæ¬ä¿¡æ¯:');
dbms_output.put_line('å·¥å·:' || vrt_emp.empno);
dbms_output.put_line('å·¥èµ:' || vrt_emp.sal);
dbms_output.put_line('å
¥èæ¥æ:' || vrt_emp.hiredate);
end;
2.2å¨æSQLè¯å¥æ¯ä¸ä¸ªå¯ä»¥è¿åå¤è¡çSELECTè¯å¥
2.2.1åªæä¸ä¸ªå ä½ç¬¦
使ç¨å¨æSQLè¯å¥è¿åå¤è¡è®°å½ï¼æ¥è¯¢30é¨é¨çåå·¥åºæ¬ä¿¡æ¯ï¼
declare
v_sql_text varchar2(1000);
v_deptno emp.deptno%type := 30;
type nt_emp is table of emp%rowtype;
vnt_emp nt_emp;
begin
v_sql_text := 'select * from emp e where e.deptno = :deptno';
execute immediate v_sql_text bulk collect
into vnt_emp
using v_deptno;
for i in 1 .. vnt_emp.count loop
dbms_output.put_line(vnt_emp(i).ename || 'çåºæ¬ä¿¡æ¯:');
dbms_output.put_line('å·¥å·:' || vnt_emp(i).empno);
dbms_output.put_line('å·¥èµ:' || vnt_emp(i).sal);
dbms_output.put_line('å
¥èæ¥æ:' || vnt_emp(i).hiredate);
dbms_output.put_line('');
end loop;
end
2.2.2å¤ä¸ªå ä½ç¬¦
æ¥è¯¢20é¨é¨å·¥èµå¤§äº2000çåå·¥åºæ¬ä¿¡æ¯ï¼
declare
v_sql_text varchar2(1000);
v_deptno emp.deptno%type := 20;
v_sal number := 2000;
type nt_emp is table of emp%rowtype;
vnt_emp nt_emp;
begin
v_sql_text := 'select * from emp e where e.sal>:sal and e.deptno = :deptno';
execute immediate v_sql_text bulk collect
into vnt_emp
using v_sal, v_deptno; --注æç»å®å¤ä¸ªåéæ¶ï¼ç»å®åéåªä¸å ä½ç¬¦ä½ç½®æå
³ï¼ä¸å ä½ç¬¦å称æ å
³ï¼
for i in 1 .. vnt_emp.count loop
dbms_output.put_line(vnt_emp(i).ename || 'çåºæ¬ä¿¡æ¯:');
dbms_output.put_line('å·¥å·:' || vnt_emp(i).empno);
dbms_output.put_line('å·¥èµ:' || vnt_emp(i).sal);
dbms_output.put_line('å
¥èæ¥æ:' || vnt_emp(i).hiredate);
dbms_output.put_line('');
end loop;
注æï¼å¯¹äºSQLææ¬ï¼å ä½ç¬¦å称æ¯æ²¡ææä¹çï¼ç»å®åéä¸å ä½ç¬¦å称æ å
³ï¼åªä¸å ä½ç¬¦çé
ç½®æå
³ãå³ä½¿æå¤ä¸ªç¸åå称å ä½ç¬¦ï¼ä¹éè¦æ¯ä¸ªå ä½ç¬¦å¯¹åºä¸ä¸ªç»å®åéã对äºPL/SQLåï¼å ä½ç¬¦å称æ¯ææä¹çï¼ç¸åå称çå ä½ç¬¦ï¼åªéè¦ç¬¬ä¸ä¸ªå ä½ç¬¦ç»å®åéã
2.3å¨æSQLè¯å¥æ¯ä¸ä¸ªå¸¦æRETURNINGåå¥çDMLè¯å¥
KINGçå·¥èµå¢é¿20%ï¼è¿åå¢é¿åçå·¥èµï¼
eclare
v_sql_text varchar2(1000);
v_sal number;
v_ename emp.ename%type := 'KING';
begin
v_sql_text := 'update emp e set e.sal= e.sal*1.2 where e.ename = :ename returning e.sal into :sal';
execute immediate v_sql_text
using v_ename
returning into v_sal;
dbms_output.put_line(v_ename || ':' || v_sal);
end;
注æï¼åªæå½v_sql_textè¯å¥æreturning intoåå¥æ¶,å¨æSQLè¯å¥æè½ä½¿ç¨returning intoåå¥ã
2.4ç»å ä½ç¬¦ä¼ éNULLå¼
2.4.1éè¿æªåå§ååéä¼ éNULLå¼
declare
v_sql_text varchar2(1000);
v_deptno emp.ename%type := 'ALLEN';
v_comm emp.comm%type;
begin
v_sql_text := 'update emp e set e.comm = :comm where e.ename =:ename';
execute immediate v_sql_text
using v_comm, v_deptno;
end;
2.4.2éè¿å½æ°å°NULLå¼æ¾å¼ç转æ¢æä¸ä¸ªæç±»åçå¼
declare
v_sql_text varchar2(1000);
v_deptno emp.ename%type := 'ALLEN';
begin
v_sql_text := 'update emp e set e.comm = :comm where e.ename =:ename';
execute immediate v_sql_text
using to_number(null), v_deptno;
end;
3.OPEN FORè¯å¥
PL/SQLå¼å
¥OPEN FORè¯å¥å®é
ä¸å¹¶ä¸æ¯ä¸ºäºæ¯ææ¬å°å¨æSQLï¼èæ¯ä¸ºäºæ¯æ游æ åéãç°å¨å®ä»¥ä¸ç§æå
¶ä¼é
çæ¹å¼å®ç°äºå¤è¡çå¨ææ¥è¯¢ã
使ç¨OPEN FORè¯å¥æ¥å
³èå¨æSQLè¯å¥ç游æ åéï¼å¨OPEN FORè¯å¥çUSINGåå¥ä¸ï¼æå®å¨æSQLè¯å¥æ¯ä¸ªå ä½ç¬¦çç»å®åæ°ã
使ç¨FETCHè¯å¥è·åè¿è¡æ¶ç»æéã
使ç¨CLOSEè¯å¥å
³é游æ åé
使ç¨OPEN FORè¯å¥æ¥è¯¢åº10é¨é¨çåå·¥çåºæ¬ä¿¡æ¯ï¼
declare
type rc_emp is ref cursor;
vrc_emp rc_emp;
v_sql_text varchar2(1000);
v_deptno emp.deptno%type := 10;
vrt_emp emp%rowtype;
begin
v_sql_text := 'select * from emp e where e.deptno=:deptno';
open vrc_emp for v_sql_text
using v_deptno;
loop
exit when vrc_emp%notfound;
fetch vrc_emp
into vrt_emp;
dbms_output.put_line(vrt_emp.ename || 'çåºæ¬ä¿¡æ¯:');
dbms_output.put_line('å·¥å·:' || vrt_emp.empno);
dbms_output.put_line('å·¥èµ:' || vrt_emp.sal);
dbms_output.put_line('å
¥èæ¥æ:' || vrt_emp.hiredate);
dbms_output.put_line('');
end loop;
close vrc_emp;
end;
4.éå¤çå ä½ç¬¦å称
å¦æå¨å¨æSQLè¯å¥éå¤å ä½ç¬¦å称ï¼è¦ç¥éå ä½ç¬¦å
³èç»å®åæ°çæ¹å¼ä¾èµäºå¨æè¯å¥çç±»åã
å¦ææ§è¡çæ¯ä¸ä¸ªå¨æSQLå符串ï¼åå¿
须为æ¯ä¸ä¸ªå ä½ç¬¦æä¾ä¸ä¸ªç»å®åæ°ï¼å³ä½¿è¿äºå ä½ç¬¦æ¯éå¤çã
å¦ææ§è¡çæ¯ä¸ä¸ªå¨æPL/SQLåï¼åå¿
须为æ¯ä¸ä¸ªå¯ä¸å ä½ç¬¦æä¾ä¸ä¸ªç»å®åæ°ï¼å³éå¤çå ä½ç¬¦åªéè¦æä¾ä¸ä¸ªç»å®åæ°ã
4.1éå¤å ä½ç¬¦çå¨æSQLå符串
declare
v_sql_text varchar2(1000);
v_sal emp.sal%type := 4000;
v_comm emp.comm%type;
v_ename emp.ename%type := 'SCOTT';
begin
v_sql_text := 'update emp e set e.sal=:sal , e.comm = :sal*0.1 where e.ename =:ename returning e.comm into :comm ';
execute immediate v_sql_text
using v_sal, v_sal, in v_ename
returning into v_comm;
dbms_output.put_line(v_ename || 'å红:' || v_comm);
end;
4.2éå¤å ä½ç¬¦çå¨æPL/SQLå
declare
v_sql_text varchar2(1000);
v_sal number;
v_ename emp.ename%type := 'KING';
begin
v_sql_text := ' begin select e.sal,e.ename into :sal,:ename from emp e where e.ename =:ename; end;';
execute immediate v_sql_text
using out v_sal, in out v_ename;
dbms_output.put_line(v_ename || ':' || v_sal);
end;