Oracle中執(zhí)行動態(tài)SQL
一、概述
在一般的sql操作中,sql語句基本上都是固定的,如: SELECT t.empno,t.ename FROM scott.emp t WHERE t.deptno = 20;
但有的時候,從應(yīng)用的需要或程序的編寫出發(fā),都可能需要用到動態(tài)SQl,如:
當(dāng) from 后的表 不確定時,或者where 后的條件不確定時,都需要用到動態(tài)SQL。
使用execute immediate語句可以處理包括ddl(create、alter和drop)、DCL(grant、revoke)、DML(insert、update、delete)以及單行select語句。
execute immediate語句:
execute immediate dynamic_string
[into {define_variable[,define_variable]…|record}]
[using [in|out|in out] bind_argument[,[in|out|in out]bind_argument]…]
[{returning|return} into bind_argument[, bind_argument]…]- define_variable用于指定存放單行查詢結(jié)果的變量;
- using in bind_argument用于指定存放傳遞給動態(tài)sql值的變量,即在dynamic中存在占位符時使用;
- using out bind_argument用于指定存放動態(tài)sql返回值的變量。
二、執(zhí)行ddl、dcl語句
不能使用into和using子句。
begin execute immediate 'create table ma_org(org_codevarchar2(20),org_name varchar2(254))'; execute immediate 'drop table ma_org'; end;
語句
begin
execute immediate 'grant insert on ma_org to scott'
end;三、處理dml語句
1、給動態(tài)語句傳值(USING 子句)
如果dml語句包含占位符,那么在execute immediate語句之后必須要帶有using子句;
declare
orgcode varchar2(10);
orgname varchar2(254);
begin
orgcode := 1200;
execute immediate 'select org_name fromma_org
where org_code = :X'
into orgname
using orgcode;
dbms_output.put_line(orgname);
end;2、從動態(tài)語句檢索值(INTO子句)
3、動態(tài)調(diào)用存儲過程
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;4、處理包含returing子句的DML語句
如果dml語句帶有returning子句,那么在execute immediate語句之后必須帶有returning into子句,并且此時只能處理作用的單行上的dml語句,如果dml語句作用在多行上,則必須使用bulk子句。
declare
orgcode varchar2(10);
orgname varchar2(254);
rname varchar2(254);
begin
orgcode := '1200';
orgname := '天津市分行';
execute immediate 'update ma_org set org_name=:X
where org_code = :Y returning org_name into :rname'
using orgname, orgcode
returning into rname;
dbms_output.put_line(orgname);
end;5、在retuing into中使用bulk collect into
四、處理多行查詢
oracle通過使用bulk collect into子句處理動態(tài)sql中的多行查詢可以加快處理速度,從而提高應(yīng)用程序的性能。當(dāng)使用bulk子句時,集合類型可以是plsql所支持的索引表、嵌套表和varray,但集合元素必須使用sql數(shù)據(jù)類型。在oracle9i以后,有三種語句支持bulk子句,execute immediate,fetch和forall。
1、使用動態(tài)游標(biāo)(游標(biāo)變量)處理多行查詢類動態(tài)sql語句。
DECLARE
TYPE ref_cur IS REF CURSOR;
rc ref_cur;
emprow emp%ROWTYPE;
v_sql VARCHAR2(100):= 'select * from emp where deptno = :x'; --動態(tài)執(zhí)行的SQL語句
BEGIN
OPEN rc FOR v_sql USING 30; --打開游標(biāo),綁定執(zhí)行的SQL語句,并傳遞參數(shù)
LOOP
FETCH rc INTO emprow;
EXIT WHEN rc%NOTFOUND;
dbms_output.put_line('name:'||emprow.ename||' sal:'||emprow.sal);
END LOOP;
CLOSE rc;
END;2、在execute immediate中使用bulk collect into
示例:
declare
type org_table_type is table of ma_org%rowtype;
org_table org_table_type;
v_orgcode varchar2(20);
begin
v_orgcode := '%00%';
execute immediate 'select * from ma_org where org_code like:v_orgcode' bulk collect into org_table
using v_orgcode;
for i in 1..org_table.count
loop
dbms_output.put_line(org_table(i).org_code||','||org_table(i).org_name);
end loop;
end;3、在forall語句中使用bulk collect into語句
示例:
declare
type type_org_code is table of ma_org.org_code%type;
type type_org_name is table of ma_org.org_name%type;
v_orgcode type_org_code;
v_orgname type_org_name;
begin
v_orgcode := type_org_code('1100','1200');
forall i in 1..v_orgcode.count
execute immediate 'update ma_org set org_name = org_code||org_namewhere org_code = :p1 returning org_name into :p2'
using v_orgcode(i)
returning bulk collect into v_orgname;
for i in v_orgname.first..v_orgname.last
loop
dbms_output.put_line(v_orgname(i));
end loop;
end;到此這篇關(guān)于Oracle中執(zhí)行動態(tài)SQL的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Oracle SQL Developer顯示的時間包含時分秒的設(shè)置方法
Oracle SQL Developer是Oracle公司出品的一個免費的集成開發(fā)環(huán)境,本篇文章給大家介紹Oracle SQL Developer顯示的時間包含時分秒的設(shè)置方法,需要的朋友參考下吧2015-09-09
winserver 2012R2 安裝oracle及創(chuàng)建表流程(推薦)
這篇文章主要介紹了winserver 2012R2 安裝oracle及創(chuàng)建表流程,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-06-06
Oracle ORA-22908(NULL表值的參考)異常分析與解決方法
這篇文章主要介紹了Oracle ORA-22908(NULL表值的參考)異常分析與解決方法,大家可以參考使用2013-11-11
教你使用PLSQLDeveloper14連接Oracle11g的詳細過程
今天給大家?guī)硪黄坛剃P(guān)于用PLSQLDeveloper14連接Oracle11g的詳細過程,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友參考下吧2021-09-09



