Oracle中動態SQL詳解

2022-08-28 20:00:15 字數 3969 閱讀 3961

一:靜態sql與動態sql

oracle編譯pl/sql程式塊分為兩種:一種為前期聯編(early

binding),即sql語句在程式編譯期間就已經確定,大多數的編譯情況屬於這種型別;另外一種是後期聯編(late

binding),即sql語句只有在執行階段才能建立,例如當查詢條件為使用者輸入時,那麼oracle的sql引擎就無法在編譯期對該程式語句進行確定,只能在使用者輸入一定的查詢條件後才能提交給sql引擎進行處理。通常,靜態sql採用第一種編譯方式,而動態sql採用後一種編譯方式。

二:動態sql程式開發

理解了動態sql編譯的原理,也就掌握了其基本的開發思想。動態sql既然是一種」不確定」的sql,那其執行就有其相應的特點。oracle中提供了execute

immediate語句來執行動態sql,語法如下:

1

execute

immediate 動態sql語句

2using 繫結引數列表

對這一語法作如下說明:

1)動態sql是指ddl和不確定的dml(即帶引數的dml);

2)繫結引數列表為輸入引數列表,即其型別為in型別,在執行時刻與動態sql語句中的引數(實際上佔位符,可以理解為函式裡面的形式引數)進行繫結;

3)由於動態sql是在執行時刻進行確定的,所以相對於靜態而言,其更多的會損失一些系統效能來換取其靈活性。

舉例:設資料庫的emp表,其資料為如下:

idname

salary

100jacky

5600

101rose

3000

102john

4500

1.建立該錶、新增資料。 

1

declare

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;

1

declare

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.根據大於特定的薪水的查詢相應的員工資訊。 

1

create

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型別引數返回影響的行數。

1

create

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...