一:靜態sql與動態sql
oracle編譯pl/sql程式塊分為兩種:一種為前期聯編(early
binding),即sql語句在程式編譯期間就已經確定,大多數的編譯情況屬於這種型別;另外一種是後期聯編(late
binding),即sql語句只有在執行階段才能建立,例如當查詢條件為使用者輸入時,那麼oracle的sql引擎就無法在編譯期對該程式語句進行確定,只能在使用者輸入一定的查詢條件後才能提交給sql引擎進行處理。通常,靜態sql採用第一種編譯方式,而動態sql採用後一種編譯方式。
二:動態sql程式開發
理解了動態sql編譯的原理,也就掌握了其基本的開發思想。動態sql既然是一種」不確定」的sql,那其執行就有其相應的特點。oracle中提供了execute
immediate語句來執行動態sql,語法如下:
1execute
immediate 動態sql語句
2using 繫結引數列表
對這一語法作如下說明:
1)動態sql是指ddl和不確定的dml(即帶引數的dml);
2)繫結引數列表為輸入引數列表,即其型別為in型別,在執行時刻與動態sql語句中的引數(實際上佔位符,可以理解為函式裡面的形式引數)進行繫結;
3)由於動態sql是在執行時刻進行確定的,所以相對於靜態而言,其更多的會損失一些系統效能來換取其靈活性。
舉例:設資料庫的emp表,其資料為如下:
idname
salary
100jacky
5600
101rose
3000
102john
4500
1.建立該錶、新增資料。
1declare
2 tablename varchar2(20); --
表名3 field1 varchar2(20); --
欄位1名稱
4 datatype1 varchar2(20); --
欄位1型別
5 field2 varchar2(20); --
欄位2名稱
6 datatype2 varchar2(20); --
欄位2型別
7 field3 varchar2(20); --
欄位3名稱
8 datatype3 varchar2(20); --
欄位3型別
9 str_sql varchar2(500); --
拼接sql語句的字串
10begin
11 tablename :=
'emp';
12 field1 :='id
';13 datatype1 :=
'number';
14 field2 :=
'name';
15 datatype2 :=
'varchar(10)';
16 field3 :=
'salary';
17 datatype3 :=
'number';
18 str_sql :=
'create table
'||tablename||'(
'||field1||''
||datatype1||',
'||field2||''
||datatype2||',
'||field3||''
||datatype3||')
';19execute
immediate str_sql;
20exception
21when others then
22 dbms_output.put_line('
操作失敗!');
23end;
1declare
2 v_id number
;3 v_name varchar(20
);4 v_salary number
;5 str_sql varchar2(500); --
儲存拼接的sql語句
6begin
7 v_id :=
&vid;
8 v_name :=
'&name';
9 v_salary:=
&vsal;
1011 str_sql :=
'insert into emp values(:1,:2,:3)
'; --
使用佔位符代表變數
12execute
immediate str_sql
13 using v_id, v_name,v_salary; --
使用變數替換sql中的佔位符,v_id替換:1,v_name替換:2,依此類推。
1415
commit;16
end;
2.根據大於特定的薪水的查詢相應的員工資訊。
1create
orreplace
procedure find_emp(p_salary number) is
2 v_emp emp%
rowtype;
3type my_cursor is ref cursor;
4v_my_cursor my_cursor;
5begin
6open v_my_cursor for
'select * from emp where salary >:1'7
using p_salary;89
loop
10fetch v_my_cursor into
v_emp;
11exit
when v_my_cursor%
notfound;
12 dbms_output.put_line('
薪水大於
'||p_salary||
'的員工有: ');
13 dbms_output.put_line('
id為
'||v_emp.id||
'姓名為:'||
v_emp.name);
14end
loop;
15close
v_my_cursor;
16end;
3.刪除指定表的資料,並通過out型別引數返回影響的行數。
1create
orreplace
procedure del_rows(p_table_name in
varchar2
,2 p_rows_deld out number) is
3begin
4execute immediate '
delete from '||
p_table_name;
5 p_rows_deld := sql%
rowcount;6
end;
注意:
第2個程式動態sql語句使用了佔位符「:1「,其實它相當於函式的形式引數,使用」:「作為字首,然後使用using語句將p_salary在執行時刻將:1給替換掉,這裡p_salary相當於函式裡的實參。其中開啟的游標為動態游標,它也屬於動態sql的範疇,其整個編譯和開發的過程與execute immediate執行的過程很類似。
三:小結
本文對動態sql的編譯原理、開發過程進行簡單介紹,對動態sql程式開發有了乙個總體的認識。
oracle 中的動態 SQL
在 pl sql 塊中,可以使用 ddl 語句和事物控制語句,但還有很多語句不能直接在 pl sql 中執行,比如 ddl,這些語句可以使用動態 sql 來執行。connected to oracle database 11g enterprise edition release 11.2.0.1....
Oracle中動態SQL拼接
1.直接用單引號,單引號的使用是就近配對,即就近原則。從第二個單引號開始被視為轉義符 v sql insert into bjtongrentangtemptb select distinct h.sellerid,h.sellercode,h.sellername,h.prodcode,h.pro...
Oracle動態sql中的轉義符
單引號雙重角色 字串引用與轉義 在oracle中,單引號有兩個作用,一是字串是由單引號引用,二是轉義,開始學習時動態構成sql時經常不解。單引號的使用是就近配對,即就近原則。而在單引號充當轉義角色時相對不好理解。1 從第二個單引號開始被視為轉義符,如果第二個單引號後面還有單引號 哪怕只有乙個 sql...