1. 程式人生 > >oracle對動態sql語句的處理

oracle對動態sql語句的處理

1、靜態SQL語句效能優於動態SQL語句,如果功能確定最好使用靜態SQL語句

2、使用execute immediate語句,用於處理除了多行查詢之外的任何動態SQL,包括DDL、DCL、DML、以及單行Select語句

3、使用動態引用遊標OPEN-FOR、FETCH、CLOSE語句處理多行查詢語句

4、使用批量的動態SQL語句,可以提高pl/sql效能

一、處理DDL語句

begin
  declare
    v_sql varchar2(2000);
  begin
    v_sql:='create table test as select * from dept';
    execute immediate v_sql;
  end;
end;


二、處理DCL語句

begin
  declare
    v_sql varchar2(2000);
  begin
    v_sql:='grant select on test to user_01';
    execute immediate v_sql;
  end;
end;


三、處理DML語句

根據DML語句是否有佔位符、是否是returning子句處理方式不同

1、處理無佔位符和returning子句的DML語句

begin
  declare
    v_sql varchar2(2000);
  begin
    v_sql:='update test set loc=''HELLOWORLD'' where deptno=10';
    execute immediate v_sql;
  end;
end;


2、處理有佔位符無returning子句的DML語句

begin
  declare
    v_sql varchar2(2000);
  begin
    v_sql:='update test set loc=:loc where deptno=:deptno';
    execute immediate v_sql using &1,&2;
  end;
end;


3、處理無佔位符有returning子句的DML語句

begin
  declare
    v_sql varchar2(2000);
    v_dname dept.dname%type;
  begin
    v_sql:='update test set loc=''HELLOWORLD'' where deptno=10 returning dname into :name';
    execute immediate v_sql returning into v_dname;
    dbms_output.put_line(v_dname||'被更新');      
  end;
end;


4、處理含佔位符有returning子句的DML語句

begin
  declare
    v_sql varchar2(2000);
    v_dname dept.dname%type;
  begin
    v_sql:='update test set loc=''HELLOWORLD'' where deptno=:deptno returning dname into :name';
    execute immediate  v_sql using &deptno returning into v_dname;
    dbms_output.put_line(v_dname||'被更新');      
  end;
end;


四、處理單行查詢

begin
  declare
    v_sql varchar2(2000);
    v_record dept%rowtype;
  begin
    v_sql:='select * from dept where deptno=:deptno';
    execute immediate v_sql into v_record using &deptno ;
    dbms_output.put_line('部門名稱:'||v_record.dname);      
  end;
end;


通過記錄變數來獲取資料

五、處理多行查詢

begin
  declare
    type dept_cur is ref cursor;
    c_dept dept_cur;
    v_sql varchar2(2000);
    v_record dept%rowtype;
  begin
    v_sql:='select * from dept where deptno=:deptno';
    open c_dept for v_sql using &deptno;
    loop
      fetch c_dept into v_record;
      exit when c_dept%NOTFOUND;
      dbms_output.put_line('部門名稱:'||v_record.dname);      
    end loop;
    close c_dept;    
  end;
end;


六、在動態SQL語句中使用批量繫結

在動態SQL語句中使用批量繫結,可以加快批量資料的處理速度,提高效能;

當使用批量繫結時,集合元素要使用SQL的資料型別而非PL/SQL資料型別,最好通過%TYPE,%ROWTYPE來

(1)、在動態DML語句上面使用批量繫結

語法:

FORALL index IN 1..v_tab.count
     execute immediate v_sql using v_tab(i);


舉例:

begin
  declare
    type dept_var is varray(3) of dept.deptno%type;
    v_dept dept_var;
    v_sql varchar2(2000);    
  begin
    v_dept:=dept_var(1,2,3);
    v_sql:='update dept set loc=''測試資料'' where deptno=:deptno';    
    forall i IN 1..v_dept.count
      execute immediate v_sql using v_dept(i) ;    
  end;
end;


(2)、在DML返回子句上使用批量繫結

語法:

execute immediate v_sql
   returning bulk collect into v_coll;


舉例:

begin
  declare
    type dname_tab is table of dept.dname%type;
    v_name dname_tab;
    type loc_tab is table of dept.loc%type;
    v_loc loc_tab;
    v_sql varchar2(2000);    
  begin    
    v_sql:='update dept set loc=''測試資料DDDDD'' where deptno=:deptno returning dname,loc into :1,:2';       
    execute immediate v_sql using &deptno returning bulk collect into v_name,v_loc;    
    for i IN 1..v_name.count loop
      dbms_output.put_line('部門名稱:'||v_name(i)||'  地址:'||v_loc(i));      
    end loop;
  end;
end;


(3)、在execute immediate語句上使用批量繫結查詢語句

語法:

execute immediate v_sql bulk collect into v_coll;


舉例:

begin
  declare
    type dname_tab is table of dept.dname%type;
    v_name dname_tab;
    type loc_tab is table of dept.loc%type;
    v_loc loc_tab;
    v_sql varchar2(2000);    
  begin    
    v_sql:='select dname,loc from dept where deptno=:deptno';       
    execute immediate v_sql bulk collect into v_name,v_loc using &deptno;    
    for i IN 1..v_name.count loop
      dbms_output.put_line('部門名稱:'||v_name(i)||'  地址:'||v_loc(i));      
    end loop;
  end;
end;

(4)、在遊標FETCH語句中使用批量提取

語法:

fetch v_cursor bulk collect into v_coll;


舉例:

begin
  declare
    type c_ref is ref cursor;
    c_dept c_ref;
    type dname_tab is table of dept.dname%type;
    v_name dname_tab;
    type loc_tab is table of dept.loc%type;
    v_loc loc_tab;
    v_sql varchar2(2000);    
  begin    
    v_sql:='select dname,loc from dept where deptno=:deptno';  
    open c_dept for v_sql using &deptno;
    fetch c_dept bulk collect into v_name,v_loc;
    close c_dept;
    
    for i IN 1..v_name.count loop
      dbms_output.put_line('部門名稱:'||v_name(i)||'  地址:'||v_loc(i));      
    end loop;    
  end;
end;

相關推薦

oracle動態sql語句處理

1、靜態SQL語句效能優於動態SQL語句,如果功能確定最好使用靜態SQL語句 2、使用execute immediate語句,用於處理除了多行查詢之外的任何動態SQL,包括DDL、DCL、DML、以及單行Select語句 3、使用動態引用遊標OPEN-FOR、FETCH、C

Oracle 動態遊標 PL/SQL 動態SQL語句 open for [using] 語句

PL/SQL:open for [using] 語句 2017年07月19日 09:52:55 學孩兒無牙哭做粥 閱讀數:681 標籤: oracleSQLPLSQL 更多 個人分類: ORACLESQL/PLSQL 版權宣告:

Oracle PL/SQL進階程式設計(第十五彈:動態SQL語句

理解動態SQL語句 動態SQL語句基礎 動態SQL語句不僅是指SQL語句是動態拼接而成的,更主要的是SQL語句所使用的物件也是執行時期才建立的。出現這種功能跟PL/SQL本身的早起繫結特性有關,早PL/SQL中,所有的物件必須已經存在於資料庫中才能執行,

Oracle動態SQL語句

在使用ODP.NET進行Oracle程式設計時,有時候SQL語句非常複雜,需要採用動態構造查詢語句的情況,有兩種方法可以構造動態的SQL語句,並執行返回結果集。 1、在資料訪問層構造SQL語句 例如下面的語句,將構造完整的SQL語句賦值給CommandText,再傳遞到資料庫進行執行,返回結果集。 loa

oracle儲存過程中如何執行動態SQL語句

有時需要在oracle儲存過程中執行動態SQL語句 ,例如表名是動態的,或欄位是動態的,或查詢命令是動態的,可用下面的方法: set serveroutput ondeclare    n number;    sql_stmt varchar2(50);    t varc

(三)Oracle學習筆記—— sql語句

dna 聯合 com .com 外連接 color 分組查詢 cot 語句 0. scott 用戶默認表介紹 scott用戶Tables目錄下包含四張表 1. insert(插入)語句 給指定列插入數據: insert into de

存儲過程中執行動態Sql語句

查詢 需要 一點 定義 data 復制 ast 我們 臨時   在最近的項目中,有用到動態執行sql語句,SQL為我們提供了兩種動態執行SQL語句的命令,分別是EXEC和sp_executesql;通常,sp_executesql則更具有優勢,它提供了輸入輸出接口,而EXE

Oracle本地動態 SQL

需要 lec strong exe exce urn 輸出參數 靜態 select 本地動態 SQL 首先我們應該了解什麽是動態 SQL,在 Oracle數據庫開發 PL/SQL塊中我們使用的 SQL 分為:靜態 SQL語句和動態 SQL語句。所謂靜態 SQL指在

Mybatis中的update動態SQL語句 <trim></trim> 用法

color 單獨 null 多個 ride 逗號 myba 不用 log Mybatis Mapper中文件中 update時,需要set設置多個字段,有時逗號處理時,會報錯誤,所以會使用到<trim></trim> 使用trim就是為了刪掉最後

MySQL基礎----動態SQL語句

字段名 基礎 art prepare eat file 動態 執行 esql 尊重原創:http://blog.csdn.net/abc19900828/article/details/39501643 動態sql語句基本語法 1 :普通SQL語句可以用Exec執行 e

oracle dataguard常用sql語句

dataguardselect log_mode,open_mode ,database_role from v$database; --查看dataguard主備庫狀態 select status from v$instance; --查看數據庫狀態 alter database recover manag

怎樣SQL存儲過程中執行動態SQL語句

緩存 參數 insert 每次 一點 證明 record scac 清空緩存 MSSQL為我們提供了兩種動態執行SQL語句的命令,分別是EXEC和sp_executesql;通常,sp_executesql則更具有優勢,它提供了輸入輸出接口,而EXEC沒有。還有一個最大的好

MyBatis中動態SQL語句完成多條件查詢

null nbsp mybatis myba 查詢 from ref HR OS http://blog.csdn.net/yanggaosheng/article/details/46685565 MyBatis中動態SQL語句完成多條件查詢 <select i

Mybatis動態SQL語句使用

第一個 from 在外 字符串 each nbsp mea pack ger 在實際開發中,有時候查詢條件可能是不確定的,查詢條件可能有多條也可能沒有,這時候就需要用到動態的sql語句拼接功能。 一、if、where、sql標簽的使用 需求:在一些高級查詢中,查詢條件存

Mybatis動態sql語句(OGNL語法)

type 語法 key ognl select 動態 font tab class 下面是Mybatis動態sql語句(即OGNL語法)的簡單案例 1.創建表 create table test(id int primary key auto_increment,n

Oracle動態SQL詳解(EXECUTE IMMEDIATE)

Oracle中動態SQL詳解(EXECUTE IMMEDIATE) 2017年05月02日 18:35:48 悠悠傾我心 閱讀數:744 標籤: oracle動態sqloracle 更多

oracle:基本的SQL語句

一、基本語句 show user --檢視登入登入的使用者賬戶 conn hr/hr 切換使用者 start up 開啟資料庫 檢視hr例項的狀態: SELECT username,account_status FROM dba_users WHERE username=‘HR’; 修改hr

專案問題記錄------Mabatis動態sql語句

現在在做一個模糊查詢功能,使用兩個查詢條件:   條件1:下拉框選擇的產品名 條件2:輸入框輸入的使用者名稱 需求1:下拉框的選項是從資料庫裡匯出來的產品名,此外,新增一個選項“全部產品”,即使用者可以選擇某個產品,也可以選擇所有產品; 需求2:輸入框可以輸入,也可以不輸入,輸入就按輸

踩坑經歷(六)MySQL之生成動態SQL語句

delimiter $$ drop procedure if exists test_tb; create procedure test_tb() begin #DECLARE t_error INTEGER DEFAULT 0; -- DECLARE u

使用Mybatis動態sql語句時出現:元素內容必須由格式正確的字元資料或標記組成

>號用&gt;表示,<號用&lt;表示 @Select("<script> select sum(amount) from user_bills where " + " bill_type=#{billType