oracle中execute immediate的使用(select/insert/update/delete)(

 

execute immediate的語法如下:

execute immediate 'sql';
execute immediate 'sql_select' into var_1, var_2;
execute immediate 'sql' using [in|out|in out] bind_var_1, [in|out|in out] bind_var_2;
execute immediate 'sql_select' into var_1, var_2 using [in|out|in out] bind_var_1, [in|out|in out] bind_var_2;
execute immediate 'sql' returning into var_1;
execute immediate 'sql' bulk collect into indexed_var;


用法實例:
Declare
v_table varchar2(20);
v_sql Varchar2(100);
Begin
v_table:='hqf.testtable';
v_sql:='select * from '||v_table;
dbms_output.put_line(v_table);
dbms_output.put_line(v_sql);
Execute Immediate v_sql;
End;


Declare
v_sid Integer:=20020101;
v_sql Varchar2(100);
v_result Varchar2(50);
Begin
--v_sid:=12;
v_sql:='Select loc into v_result from scott.dept d where d.deptno=:1 ';

dbms_output.put_line(v_sql);
--dbms_output.put_line(v_result);
Execute Immediate v_sql
Using 10 ;
Commit;

End;

--動態命令的實用參考一( select ..into)
--Execute immediate 命令在使用into關鍵字時與靜態的plsql塊中
--into關鍵字使用方法上的區別。

declare
v_result varchar2(20);
begin
execute immediate 'select dname from scott.dept d where d.deptno=:1' Into v_result --:1這是一個綁定變量
Using 70;
commit;
dbms_output.put_line('結果爲:'||v_result);
end;
--綁定變量,通俗的講就是一個佔位的參數,而後用using中的常量或着變量去找它的相應

Declare
v_result Varchar2(20);
Begin
Select dname Into v_result From scott.dept d Where d.deptno=10;
dbms_output.put_line(v_result);
End;

declare
v_result varchar2(20);
begin
execute immediate 'select dname from scott.dept d where d.deptno=:1' Into v_result
Using 70;
commit;
dbms_output.put_line('結果爲:'||v_result);
end;


--動態命令的實用參考一( insert ..into)
--
Begin
Execute Immediate 'insert into scott.dept values (:1,:2,:3) '
Using 70,'IT','Beijing';
Commit;
End;


declare
l_depnam varchar2(20) := 'testing';
l_loc varchar2(10) := 'Dubai';
begin
execute immediate 'insert into scott.dept values (:1, :2, :3)'
using 60, l_depnam, l_loc;
commit;
end;


---盡享動態執行sql的execute immediate的命令使用的魅力。
--對比靜態的測試,和動態測試。
Declare
v_result Varchar2(20);
Begin
v_result:=mypackage.myfun1(10);
dbms_output.put_line(v_result);
mypackage.mypro1(20020101,v_result);
dbms_output.put_line(v_result);

End;
--Select * From student s Where s.student_id=20020101;
---Select * From testtable Where recordnumber=10;


Declare
v_result Varchar2(20);
Begin
--動態執行函數
Execute Immediate 'begin :1:=mypackage.myfun1(:2); end;'
Using Out v_result,In 10;
Commit;
dbms_output.put_line(v_result);

--動態執行存儲過程
Execute Immediate 'begin mypro1(:1,:2); end;'
Using In 20020101,Out v_result;
Commit;
dbms_output.put_line(v_result);
End;


--動態執行update語句實例:
create or replace function f_testweekday
return integer
is
v_sql varchar(2000);
i_sendcount integer;
begin
--_' || f_getweekday() || '
v_sql := 'update t_push_smstemp_inform set sendcount=sendcount+1 returning sendcount into :1';

execute immediate v_sql using out i_sendcount;

return 0;
exception
when others then
rollback;
return 0;
end f_testweekday;

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

http://blog.sina.com.cn/s/blog_53d8bece01010ool.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章