PL SQL執行動態SQL(二)

2021-09-01 05:21:22 字數 3889 閱讀 1665

pl/sql動態sql

依據:dbms_sql包:這個包提供了一種使用動態sql來訪問資料庫的方法。

示例 1.執行插入刪除等dml語句

declare

v_cursorid number;

v_insertrecords varchar2(500);

v_numrows integer;

begin

v_cursorid := dbms_sql.open_cursor;

v_insertrecords := 'delete from bizbusinessmenuinfo where menubizname=:bizname';

dbms_sql.parse(v_cursorid,v_insertrecords,dbms_sql.native);

dbms_sql.bind_variable(v_cursorid,':bizname','1');

v_numrows := dbms_sql.execute(v_cursorid);

dbms_output.put_line(v_numrows);

exception

when others then raise;

dbms_sql.close_cursor(v_cursorid);

commit;

end;

2.執行動態ddl

declare

v_cursorid number;

v_createtablestring varchar2(500);

v_numrows integer;

begin

v_cursorid := dbms_sql.open_cursor;

v_createtablestring := 'create table bizbusinessbaseinfo(bizname varchar2(64),bizstatus char(1))';

dbms_sql.parse(v_cursorid,v_createtablestring,dbms_sql.native);

v_numrows := dbms_sql.execute(v_cursorid);

exception

when others then

if sqlcode!=-955 then raise;

else

dbms_output.put_line('talbe already exists');

end if;

dbms_sql.close_cursor(v_cursorid);

end;

3.動態查詢query

declare

v_cursorid number;

v_selectrecords varchar2(500);

v_numrows integer;

v_bizname varchar2(64);

v_bizstatus char(1);

begin

v_cursorid := dbms_sql.open_cursor;

v_selectrecords := 'select bizname,bizstatus from bizbusinessbaseinfo where bizname like :bizname';

dbms_sql.parse(v_cursorid,v_selectrecords,dbms_sql.native);

--dbms_sql.define_column繫結變數的時候,變數如果是字串,需要首席執行官度,否則會出現錯誤: 有太多的 'define_column' 說明與此次呼叫相匹配

dbms_sql.define_column(v_cursorid,1,v_bizname,64);

dbms_sql.define_column(v_cursorid,2,v_bizstatus,1);

dbms_sql.bind_variable(v_cursorid,':bizname','1%');

v_numrows := dbms_sql.execute(v_cursorid);

loop

if dbms_sql.fetch_rows(v_cursorid)=0 then exit;

end if;

dbms_sql.column_value(v_cursorid,1,v_bizname);

dbms_sql.column_value(v_cursorid,2,v_bizstatus);

dbms_output.put_line(v_bizname||' '||v_bizstatus);

end loop;

dbms_sql.close_cursor(v_cursorid);

end;

4.動態查詢的dbms_sql.last_row_count和dbms_sql.last_row_id

這兩個字段可以反映出當前檢索的進度。在上面的查詢中加入對這兩個欄位的輸出,示例如下:

declare

v_cursorid number;

v_selectrecords varchar2(500);

v_numrows integer;

v_bizname varchar2(64);

v_bizstatus char(1);

v_myrowid rowid;

v_totrow integer;

begin

v_cursorid := dbms_sql.open_cursor;

v_selectrecords := 'select bizname,bizstatus from bizbusinessbaseinfo where bizname like :bizname';

dbms_sql.parse(v_cursorid,v_selectrecords,dbms_sql.native);

--dbms_sql.define_column繫結變數的時候,變數如果是字串,需要首席執行官度,否則會出現錯誤: 有太多的 'define_column' 說明與此次呼叫相匹配

dbms_sql.define_column(v_cursorid,1,v_bizname,64);

dbms_sql.define_column(v_cursorid,2,v_bizstatus,1);

dbms_sql.bind_variable(v_cursorid,':bizname','1%');

v_numrows := dbms_sql.execute(v_cursorid);

v_numrows := dbms_sql.execute(v_cursorid);

loop

if dbms_sql.fetch_rows(v_cursorid)=0 then exit;

end if;

v_totrow := dbms_sql.last_row_count;

v_myrowid := dbms_sql.last_row_id;

dbms_output.put_line('the last row count is:'||v_totrow||

' the last rowid is:'||v_myrowid);

dbms_sql.column_value(v_cursorid,1,v_bizname);

dbms_sql.column_value(v_cursorid,2,v_bizstatus);

dbms_output.put_line(v_bizname||' '||v_bizstatus);

end loop;

dbms_sql.close_cursor(v_cursorid);

end;

mysql執行動態sql語句

今天oracle群上有人問mysql可不可以執行動態的sql語句,搜了一下,居然可以。set tsql select from companyinfo prepare stmt1 from tsql execute stmt1 set fid fid set table1 companyinfo s...

JDBC中執行靜態SQL和執行動態SQL區別

1.執行靜態sql 獲取到的statement執行sql語句物件 只能執行靜態的sql語句 sql寫死 直接執行的 拼接sql 載入驅動 獲取連線物件 獲取執行語句物件 執行sql語句 a.executequery sql 查 a.executeupdate sql 增刪改 處理結果集物件 釋放資源...

PLSQL中執行本地動態SQL

在pl sql中只有dml sql可以直接執行,使用oracle內建的dbms sql包,可以執行動態sql語句 在執行時生成乙個sql的串,將該串提交給dbms包來執行 data manlpulation language dml 包括 select,insert,delete,set trans...