Oracle 支持兩種類型 SQL: 靜態(tài) SQL 和動態(tài) SQL 。在靜態(tài) SQL 中, SQL 語句在編譯時就已經全部確定,語法和語義的引用問題也是在編譯時全部解析確定。在動態(tài) SQL 中, SQL 語句是由字符串組成的,在運行時動態(tài)執(zhí)行。動態(tài) PL/SQL 也是如此。
DBMS_SQL
與本地動態(tài)
SQL
比較
1、? 動態(tài) SQL 語句最長度限制在 32K 以內。比這個長的語句就只能用 DBMS_SQL 來處理 .
2、? 還有很多。。省略
一個最簡單的例子 :
SQL>? declare
? 2????? dyn_tab_name varchar2(20):='t_temp';
? 3????? dyn_string varchar2(150);
? 4?? begin
? 5???? dyn_string:='create table '||dyn_tab_name||' (colA number not null)';
? 6???? execute immediate dyn_string;
? 7? end;
? 8? /
使用 DBMS_SQL 的過程包括以下五個步驟
1、??? 以字符串的形式構造動態(tài) SQL 語句
2、??? 專用明游標句柄并為該句柄打開游標
3、??? 解板動態(tài)構造的 SQL 語句,把該 SQL 語句與游標句柄關聯(lián)。
4、??? 執(zhí)行 SQL 語句
5、??? 關閉游標
如
SQL> declare
? 2????????? dyn_tab_name varchar2(20):='t_temp';
? 3????????? dyn_string varchar2(150);
?
? 5????????? ret_code integer;
? 6????? begin
? 7??????? dyn_string:='create table '||dyn_tab_name||'( colA number not null)';
?
? 9?????? dbms_sql.parse(c,dyn_string,dbms_sql.v7);
?10?????? ret_code:=dbms_sql.execute(c);
?11?????? dbms_sql.close_cursor(c);
?12???? end;
?13? /
本地動態(tài)
SQL
語句
關于動態(tài) DDL 、 DML 和會話控制的本地動態(tài) SQL 語句如下所示
1、? Execute immediate <dyn_string>
2、? Execute immediate <dum_string> using < 參數 >
3、? Execute immediate <dyn_string>into <index-by 、 array 、嵌套表 >using< 參數 >
4、? Open cursor for <dyn_string>
5、? Open cursor form <dyn_string>? using < 參數 >
6、? Close <cursor>
7、? Execute immediate ‘begin…..end’ using < 參數 >
動態(tài)
DDL
動態(tài) DDL 處理的是使用運行時為數據庫對象提供的值的 DDL 語句。動態(tài) DDL 一個典型的用法就是,創(chuàng)建僅在運行時表名和列名才可用的一個動態(tài)表。可以使用以下 DDL 語句 :
1 、 Execute immediate <dyn_string>
2 、 Execute immediate <dum_string> using < 參數 >
一個使用動態(tài) DDL 創(chuàng)建表的存儲過程
create
or
replace
procedure dyn_ddl_demo(tablename varchar2,errnum? outnumber,errtext outvarchar2)
authidcurrent_user
is
? dyn_string varchar2(
1000
);
? dyn_tablename varchar2(
30
);
begin
? dyn_tablename:=tablename;
? dyn_string:=
'create table '
||dyn_tablename||
?
'(order_id number(10) primary key,
??? order_date date not null,
??? total_qty number,
??? total_price number(15,2)
?? )'
;
?? dbms_output.put_line(
'dyn_string--->'
||dyn_string);
?? executeimmediate dyn_string;
?? errnum:=
0
;
exception
?? whenothersthen
????? errnum:=sqlcode;
????? errtext:=
'ERR: Create table '
||dyn_tablename||
'---'
||sqlerrm;
end dyn_ddl_demo;
動態(tài)
SELECTS
查詢可以返回一行記錄或多行記錄。多行記錄的在《本地批綁定》里再介紹
單行
Selects
Execute immediate <dyn_string> into < 變量 > using < 參數 >
如 :
create
or
replace
procedure dyn_selects(
vid number,
errnum outnumber,
errtext outvarchar2)
is
? sql_string varchar2(
500
);
? id number;
? uname varchar2(
200
);
? sex varchar2(
2
);
?
? upd_string varchar2(
500
);
? vname varchar2(
200
);
? vsex varchar2(
2
);
? vvid number;
begin
? sql_string :=
'select * from t_user where id=:vid'
;
? executeimmediate sql_string into id,uname,sex using vid;
? dbms_output.put_line(id||
'----'
||uname||
'----'
||sex);
?
? upd_string:=
'update t_user set name=:vname,sex=:vsex where id=:vvid'
;
? vname:=
'
傻瓜
'
;
? vsex:=
'xx'
;
? vvid:=
3
;
?
? executeimmediate upd_string using vname,vsex,vvid;
? errnum:=
0
;
exception
? whenothersthen
???? errnum:=sqlcode;
???? errtext:=sqlerrm;
end dyn_selects;
動態(tài)
INSERT
、
UPDATE
和
DELETE
除了 DDL 語句和 DML 的單 SELECT 語句以外,還能動態(tài)地構造 INSERT 、 UPDATE 和 DELETE 語句并在運行時執(zhí)行它們。可以使用以下語句執(zhí)行 insert,update,delete 語句
?????? Execute immediate <dyn_string>
??? Execute immediate <dyn_string> into < 變量 > using < 參數 >