1. 程式人生 > 其它 >oracle繫結變數的使用

oracle繫結變數的使用

Oracle裡的繫結變數

使用繫結變數,是可以重用解析樹和執行計劃基礎條件.

繫結變數的語法:

--sql
var x number;
exec :x := 7369;
select ename from emp where empno= :x;
--plsql
declare
  vc_name varchar2(10);
begin
  execute immediate 'select ename from emp where empno= :1' into vc_name using 7788;
  dbms_output.put_line(vc_name);
end;
/
--execute immediate [帶繫結變數的sql] using [對應繫結變數的具體輸入值]

插入語句的使用

declare
   vc_sql_1 varchar2(4000);
   vc_sql_2 varchar2(4000);
   n_temp_1 number;
   n_temp_2 number;
begin
  vc_sql_1 := 'insert into sap(num_1,num_2) values(:1,:2)';
  execute immediate vc_sql_1 using 7370,7788;
  n_temp_1 := sql%rowcount;
  vc_sql_2 := 'insert into sap(num_1,num_2) values(:1,:1)
'; execute immediate vc_sql_2 using 7371,7799; n_temp_2 := sql%rowcount; dbms_output.put_line(to_char(n_temp_1+n_temp_2)); commit; end;

--using 根據位置傳入相關變數引數值
--動態sql可以使用繫結變數,returning 可以和帶繫結變數的目標sql連用,目的把受該sql影響的行記錄的對應欄位值給取出來. 
--eg
declare
    vc_column varchar2(10);
    vc_sql varchar2(4000);
    n_temp 
number; vc_name varchar2(10); begin vc_column := 'empno'; vc_sql :='delete from emp where ' || vc_column || ' = :1 returning ename into :2'; execute immediate vc_sql using 7369 returning into vc_name; dbms_output.put_line(vc_ename); commit; end;
PL/SQL中批量繫結的典型用法

主要優勢,一次處理一批資料。

可以見到地將PL/SQL引擎看做專門用來處理PL/SQL程式碼塊中除了sql之外的所有部分(eg:變數、複製、迴圈等)子系統,SQL引擎用來處理sql語句的子系統。 這裡的PL/SQL引擎和SQL引起上下文切換就是指他們之間的互動。

--減少互動,提高效能
fetch cursorname bulk collect into [自定義的屬組] <limit CN_BATCH_SIZE>

--eg "forall" 表示一次執行一批sql declare cur_emp sys_refcursor; vc_sql varchar2(4000); type namelist is table of varchar2(10); enames namelist; CN_BATCH_SIZE constant pls_integer :=1000; begin vc_sql := 'select ename from emp where empno > :1'; open cur_emp for vc_sql using 7900; loop fetch cur_emp bulk collect into enames limit CN_BATCH_SIZE; for i in 1..enames.count loop dbms_output.put_line(enames(i)); end loop; exit when enames.count < CN_BATCH_SIZE; end loop; close cur_emp; end;

Oracle裡的應用型別

應用型別一 硬解析

  • 沒有使用繫結變數,系統硬解析的比率非常高
  • 效能和可擴充套件性是最差的,可用於olap型別系統
  • 將CURSOR_SHARING設定為force,可以有效降低硬解析,提高系統的效能和可擴充套件性

應用型別二 軟解析

每次都會經歷 Open Parse,Bind,Execute,Fetch Close

引數 SESSION_CACHED_CURSORS 修改為較大值,能進一步提升效能。如果為0,無法通過已快取的Session Cursor中的父遊標來建立目標sql的Session Cursor和父遊標之間的聯絡。

  • 有效降低了硬解析
  • 執行時,其對應的Session Cursor都需要經歷Open Parse,Bind,Execute,Fetch Close
  • 由於軟解析不斷的open,close,以及對庫快取相關Latch的爭用(Oracle11g之前的版本),會影響效能
  • SESSION_CACHED_CURSORS 修改為較大值,能進一步提升效能
  • 純粹的軟解析很少見,SESSION_CACHED_CURSORS預設非0

應用型別三 軟軟解析

當Session Cursor對應的sql解析和執行的次數超過3次,Oracle就不會對上述sql執行Close操作,而是標記為Soft Closed.

  • open和Close只需經歷一次,其他都需要經歷,如Parse,Bind,Execute,Fetch

應用型別四 一次解析,多次執行

該型別通過一些手段:PL/SQL程式碼的迴圈內部執行目標SQL,使得每一條SQL語句所對應的Session Cursor會反覆經歷Execute和Fetch,其他只用經歷一次。

詳細的可以檢視:http://blog.itpub.net/29487349/viewspace-2786117/