open cursor---> parse---> execute---> close cursor;
例一:create table test(n_id number, v_name varchar2(50), d_insert_date date);
alter table test add constraint pk_id primary key(n_id);
v_stat := dbms_sql.execute(v_cursor); --執行
dbms_sql.close_cursor(v_cursor); --關閉游標
commit;
end;
例二:declare
v_cursor number;
v_sql varchar2(200);
v_id number;
v_name varchar2(50);
v_stat number;
begin
v_name := '測試 update';
v_id := 1;
v_cursor := dbms_sql.open_cursor;
v_sql := 'update test set v_name = :v_name, d_insert_date = :v_date where n_id = :v_id';
dbms_sql.parse(v_cursor, v_sql, dbms_sql.native);
dbms_sql.bind_variable(v_cursor, ':v_name', v_name);
dbms_sql.bind_variable(v_cursor, ':v_date', sysdate);
dbms_sql.bind_variable(v_cursor, ':v_id', v_id);
v_stat := dbms_sql.execute(v_cursor);
dbms_sql.close_cursor(v_cursor);
commit;
end;
例三:declare
v_cursor number;
v_sql varchar2(200);
v_id number;
v_stat number;
begin
v_id := 1;
v_sql := 'delete from test where n_id = :v_id';
v_cursor := dbms_sql.open_cursor;
dbms_sql.parse(v_cursor, v_sql, dbms_sql.native);
dbms_sql.bind_variable(v_cursor, ':v_id', v_id);
v_stat := dbms_sql.execute(v_cursor);
dbms_sql.close_cursor(v_cursor);
commit;
end;
例四:declare
v_cursor number;
v_sql varchar2(200);
v_id number;
v_name varchar2(50);
v_date varchar2(10);
v_stat number;
begin
v_sql := 'select n_id, v_name, to_char(d_insert_date, ''yyyy-mm-dd'') from test';
v_cursor := dbms_sql.open_cursor; --開啟游標
dbms_sql.parse(v_cursor, v_sql, dbms_sql.native); --解析游標
dbms_sql.define_column(v_cursor, 1, v_id); --定義列
dbms_sql.define_column(v_cursor, 2, v_name, 50); --注意:當變數為varchar2型別時,要加長度
dbms_sql.define_column(v_cursor, 3, v_date, 10);
v_stat := dbms_sql.execute(v_cursor); --執行sql
loop
exit when dbms_sql.fetch_rows(v_cursor) <= 0; --fetch_rows在結果集中移動游標,如果未抵達末尾,返回1。
dbms_sql.column_value(v_cursor, 1, v_id); --將當前行的查詢結果寫入上面定義的列中。
dbms_sql.column_value(v_cursor, 2, v_name);
dbms_sql.column_value(v_cursor, 3, v_date);
dbms_output.put_line(v_id || ':' || v_name || ':' || v_date);
end loop;
end;
這幾天一直在利用pl/sql developer寫乙個儲存過程,因為是新手,寫了好幾天,功能就是根據傳入進來的引數(表名和某一特定值查詢記錄),並將記錄插入另乙個表中。由於表名是變數,所以使用dbms_sql動態包來解析sql語句,游標也不採用靜態游標。
create or replace procedure progetlayerinfoftable(in_layername in varchar2,
in_objname in varchar2) is
--in_layername :輸入的圖層名
--in_objname:輸入的具體地理物體名
str_sql varchar2(500); --查詢字串
v_cursor number; --游標
rowprocess number;
column_name varchar2(100); --臨時變數,儲存地理物件名
column_minx float; --臨時變數,儲存從表中獲取的eminx值
column_miny float; --臨時變數,儲存從表中獲取的eminy值
2.begin
v_cursor := dbms_sql.open_cursor; --開啟游標
str_sql := 'select 名稱,t.shape.minx,t.shape.miny from ' || tablebname ||
' t where t.名稱=''' || in_objname || '''';
dbms_sql.parse(v_cursor, str_sql, dbms_sql.native);分析游標
--動態定義列,並將游標的值賦給對應列
dbms_sql.define_column(v_cursor, 1, column_name, 40);
dbms_sql.define_column(v_cursor, 2, column_minx);
dbms_sql.define_column(v_cursor, 3, column_miny);
loop
if dbms_sql.fetch_rows(v_cursor) > 0 then
dbms_sql.column_value(v_cursor, 1, column_name);
dbms_sql.column_value(v_cursor, 2, column_minx);
dbms_sql.column_value(v_cursor, 3, column_miny);
else
exit;
end if;
end loop;
dbms_sql.close_cursor(v_cursor);
end progetlayerinfo;
dbms sql包的用法
原博 對於一般的select操作,如果使用動態的sql語句則需要進行以下幾個步驟 open cursor parse define column excute fetch rows close cursor 而對於dml操作 insert,update 則需要進行以下幾個步驟 open cursor...
dbms sql包的用法
對於一般的select操作,如果使用動態的sql語句則需要進行以下幾個步驟 open cursor parse define column excute fetch rows close cursor 而對於dml操作 insert,update 則需要進行以下幾個步驟 open cursor pa...
oracle中dbms sql的使用
一 使用dbms sql執行查詢 利用dbms sql執行select語句,其順序為 open cursor parse define column execute fetch rows close cursor 1 建立班組表結構,如下圖所示 proteamid 主鍵id proteamname ...