Oracle
支持兩種類型
SQL:
靜態
SQL
和動態
SQL
。在靜態
SQL
中,
SQL
語句在編譯時就已經全部確定,語法和語義的引用問題也是在編譯時全部解析確定。在動態
SQL
中,
SQL
語句是由字符串組成的,在運行時動態執行。動態
PL/SQL
也是如此。
?
DBMS_SQL
與本地動態
SQL
比較
1、?
動態
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、???
以字符串的形式構造動態
SQL
語句
2、???
專用明游標句柄并為該句柄打開游標
3、???
解板動態構造的
SQL
語句,把該
SQL
語句與游標句柄關聯。
4、???
執行
SQL
語句
5、???
關閉游標
如
SQL> declare
? 2????????? dyn_tab_name varchar2(20):='t_temp';
? 3????????? dyn_string varchar2(150);
?
4????????? c
? integer;
? 5????????? ret_code integer;
? 6????? begin
? 7??????? dyn_string:='create table '||dyn_tab_name||'( colA number not null)';
?
8??????? c:=dbms_sql.open_cursor;
? 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? /
?
本地動態
SQL
語句
關于動態
DDL
、
DML
和會話控制的本地動態
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 <
參數
>
動態
DDL
動態
DDL
處理的是使用運行時為數據庫對象提供的值的
DDL
語句。動態
DDL
一個典型的用法就是,創建僅在運行時表名和列名才可用的一個動態表。可以使用以下
DDL
語句
:
1
、
Execute immediate <dyn_string>
2
、
Execute immediate <dum_string> using <
參數
>
?
一個使用動態
DDL
創建表的存儲過程
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;
?
動態
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;
動態
INSERT
、
UPDATE
和
DELETE
除了
DDL
語句和
DML
的單
SELECT
語句以外,還能動態地構造
INSERT
、
UPDATE
和
DELETE
語句并在運行時執行它們。可以使用以下語句執行
insert,update,delete
語句
?????? Execute immediate <dyn_string>
??? Execute immediate <dyn_string> into <
變量
> using <
參數
>
?
posted on 2006-09-28 16:26
有貓相伴的日子 閱讀(722)
評論(0) 編輯 收藏 所屬分類:
pl/sql