日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle中EXECUTE IMMEDIATE的使用技巧

發布時間:2024/4/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle中EXECUTE IMMEDIATE的使用技巧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://database.ctocio.com.cn/38/12238038.shtml

EXECUTE IMMEDIATE代替了以前Oracle中DBMS_SQL package包. 下面就為您介紹Oracle中EXECUTE IMMEDIATE的使用技巧,供您參考……

  EXECUTE IMMEDIATE代替了以前Oracle中DBMS_SQL package包. 下面就為您介紹Oracle中EXECUTE IMMEDIATE的使用技巧,供您參考。

  它解析并馬上執行動態的SQL語句或非運行時創建的PL/SQL塊.動態創建和執行SQL語句性能超前,EXECUTE IMMEDIATE的目標在于減小企業費用并獲得較高的性能,較之以前它相當容易編碼.盡管DBMS_SQL仍然可用,但是推薦使用EXECUTE IMMEDIATE,因為它獲的收益在包之上。

  -- 使用技巧

  1. EXECUTE IMMEDIATE將不會提交一個DML事務執行,應該顯式提交

  如果通過EXECUTE IMMEDIATE處理DML命令,

  那么在完成以前需要顯式提交或者作為EXECUTE IMMEDIATE自己的一部分.

  如果通過EXECUTE IMMEDIATE處理DDL命令,它提交所有以前改變的數據

  2. 不支持返回多行的查詢,這種交互將用臨時表來存儲記錄(參照例子如下)或者用REF cursors.

  3. 當執行SQL語句時,不要用分號,當執行PL/SQL塊時,在其尾部用分號.

  4. 在Oracle手冊中,未詳細覆蓋這些功能。

  下面的例子展示了所有用到Execute immediate的可能方面.希望能給你帶來方便.

  5. 對于Forms開發者,當在PL/SQL 8.0.6.3.版本中,Forms 6i不能使用此功能.

  EXECUTE IMMEDIATE -- 用法例子

  1. 在PL/SQL運行DDL語句

以下是代碼片段:
begin
execute immediate 'set role all';
end;

  2. 給動態語句傳值(USING 子句)

以下是代碼片段:
declare
l_depnam varchar2(20) := 'testing';
l_loc varchar2(10) := 'Dubai';
begin
execute immediate 'insert into dept values (:1, :2, :3)'
using 50, l_depnam, l_loc;
commit;
end;

  3. 從動態語句檢索值(INTO子句)

以下是代碼片段:
declare
l_cnt varchar2(20);
begin
execute immediate 'select count(1) from emp'
into l_cnt;
dbms_output.put_line(l_cnt);
end;

  4. 動態調用例程.例程中用到的綁定變量參數必須指定參數類型.

  黓認為IN類型,其它類型必須顯式指定

以下是代碼片段:
declare
l_routin varchar2(100) := 'gen2161.get_rowcnt';
l_tblnam varchar2(20) := 'emp';
l_cnt number;
l_status varchar2(200);
begin
execute immediate 'begin ' || l_routin || '(:2, :3, :4); end;'
using in l_tblnam, out l_cnt, in out l_status;
if l_status != 'OK' then
dbms_output.put_line('error');
end if;
end;

?

?

====

http://space.itpub.net/756652/viewspace-700456

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;

?

總結

以上是生活随笔為你收集整理的Oracle中EXECUTE IMMEDIATE的使用技巧的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。