dbms_sql包提供乙個介面,用於執行動態sql(包括ddl 和dml)。
dbms_sql定義了乙個實體叫游標id,游標id是乙個pl/sql整型數,通過游標id,可以對游標進行操作。
dbms_sql包和本地動態sql在功能上有許多重疊的地方,但是有的功能只能通過本地動態sql實現,而有些功能只能通過dbms_sql實現。
對於一般的
select操作,如果使用
動態的sql語句則需要進行以下幾個
步驟:
open
cursor--->parse---> define
column--->excute---> fetch
rows--->close
cursor;
而對於dml操作(insert,update)
則需要進行以下幾個步驟:
open
cursor--->parse---> bind
variable--->execute---> close
cursor;
對於delete
操作只需要進行以下幾個步驟:
open
cursor--->parse---> execute---> close
cursor;
利用dbms_sql執行ddl語句:
create or replace procedure createtable2(tablename varchar2)
issql_string varchar2(1000);--存放sql語句
v_cur integer;--定義整形變數,用於存放游標
begin
sql_string := 'create table ' || tablename || '(namevarchar(20))';
v_cur := dbms_sql.open_cursor;--開啟游標
dbms_sql.parse(v_cur,sql_string,dbms_sql.native);--解析並執行sql語句
dbms_sql.close_cursor(v_cur);--關閉游標
end;
利用dbms_sql執行select語句:
open
cursor--->parse---> define
column--->excute---> fetch
rows--->close
cursor;
declare
v_cursor number;--游標id
sqlstring varchar2(200);--用於存放sql語句
v_phone_name
varchar2(20);--手機名字
v_producer
varchar2(20);--手機生產商
v_price
number :=500;--手機價錢
v_count
int;--在這裡無意義,只是存放函式返回值
begin
--:p是佔位符
--select 語句中的第1列是phone_name,第2列是producer,第3列是price
sqlstring :='selectphone_name,producer,price from phone_infor where price> :p';
v_cursor :=dbms_sql.open_cursor;--開啟游標;
dbms_sql.parse(v_cursor ,sqlstring,dbms_sql.native);--解析動態sql語句;
--繫結輸入引數,v_price的值傳給 :p
dbms_sql.bind_variable(v_cursor,':p',v_price);
--定義列,v_phone_name對應select 語句中的第1列
dbms_sql.define_column(v_cursor,1,v_phone_name,20);
--定義列,v_producer對應select語句中的第2列
dbms_sql.define_column(v_cursor,2,v_producer,20);
--定義列,v_price對應select語句中的第3列
dbms_sql.define_column(v_cursor,3,v_price);
v_count := dbms_sql.execute(v_cursor);--執行動態sql語句。
loop
--從游標中把資料檢索到快取區(buffer)中,緩衝區的值只能被函式coulumn_value()所讀取
exit whendbms_sql.fetch_rows(v_cursor)<=0;
--函式column_value()把緩衝區的列的值讀入相應變數中。
--第1列的值被讀入v_phone_name中
dbms_sql.column_value(v_cursor,1,v_phone_name);
--第2列的值被讀入v_producer中
dbms_sql.column_value(v_cursor,2,v_producer);
--第2列的值被讀入v_price中
dbms_sql.column_value(v_cursor,3,v_price);
--列印變數的值
dbms_output.put_line(v_phone_name || ' '||v_producer|| ' '||v_price);
end loop;
dbms_sql.close_cursor(v_cursor);--關閉游標
end;
利用dbms_sql執行dml語句:
open
cursor--->parse---> bind
variable--->execute---> close
cursor;
declare
v_cursor number;--游標id
sqlstring varchar2(200);--用於存放sql語句
v_phone_name
varchar2(20);--手機名字
v_producer
varchar2(20);--手機生產商
v_price
number :=500;--手機價錢
v_count
int;--被dml語句影響的行數
begin
sqlstring :='
insert into phone_infor values(:a,:b,:c)';-- :a,:b,:c 是佔位符
v_phone_name
:='s123';
v_producer
:='索尼aa';
v_price
:= 999;
v_cursor :=dbms_sql.open_cursor;--開啟游標;
dbms_sql.parse(v_cursor ,sqlstring,dbms_sql.native)
;--解析動態sql語句;
--繫結輸入引數,v_price的值傳給 :p
dbms_sql.bind_variable(v_cursor,':a',v_phone_name);
dbms_sql.bind_variable(v_cursor,':b',v_producer);
dbms_sql.bind_variable(v_cursor,':c',v_price);
v_count := dbms_sql.execute(v_cursor);--執行動態sql語句。
dbms_sql.close_cursor(v_cursor);--關閉游標
dbms_output.put_line(' insert ' || to_char(v_count) ||' row ');--列印有多少行被插入
commit;
end;
oracle中dbms sql的使用
一 使用dbms sql執行查詢 利用dbms sql執行select語句,其順序為 open cursor parse define column execute fetch rows close cursor 1 建立班組表結構,如下圖所示 proteamid 主鍵id proteamname ...
Oracle應用 DBMS SQL封裝過程
dbms sql封裝過程中的主要函式 1 open cursor 返回新游標的id值 2 parse 解析要執行的語句 3 bind variable 將給定的數量與特定的變數相連線 4 define coloumn 定義字段變數,其值對應於指定游標中某個位置元素的值 僅用於select語句 5 e...
dbms sql包的用法
原博 對於一般的select操作,如果使用動態的sql語句則需要進行以下幾個步驟 open cursor parse define column excute fetch rows close cursor 而對於dml操作 insert,update 則需要進行以下幾個步驟 open cursor...