dbms sql包的用法

2021-09-06 13:36:00 字數 3953 閱讀 6641

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