create or replace procedure pro_insert_dbms
is
cid number;
cid_DDL number;
selectsql varchar2(1000);
ddlsql varchar2(1000);
row_count number;
nofrows integer;
lrowid rowid;
ddlrows integer;
errpsn integer;
sqlfcd integer;
errc integer;
errm varchar2(2000);
request_id varchar2(100);
deal_name varchar2(100);
member_name varchar2(100);
begin
dbms_output.put_line('测试dbms_sql包.....');
delete_commit('delete from test_insert i where i.inner_id=2');
selectsql:='select i.request_id,i.deal_name,i.member_name from test_insert i';
begin
cid:=dbms_sql.open_cursor;
--parse(c in integer, statement in varchar2, language_flag in integer):
--对动态游标所提供的sql语句进行解析,参数C表示游标,statement为sql语句,
--language-flag为解析sql语句所用oracle版本,一般有V6,V7跟native(在不明白所连database版本时,使用native);
dbms_sql.parse(cid,selectsql,dbms_sql.native);
--定义动态游标所能得到的对应值,其中c为动态游标,
--positon为对应动态sql中的位置(从1开始),column为该值所对应的变量,
--可以为任何类型,column_size只有在column为定义长度的类型中使用
--如VARCHAR2,CHAR等
dbms_sql.define_column(cid,1,request_id,100);
dbms_sql.define_column(cid,2,deal_name,100);
dbms_sql.define_column(cid,3,member_name,100);
row_count:=0;
nofrows:=dbms_sql.execute(cid);
exception
when others then
errpsn:=dbms_sql.last_error_position;
sqlfcd:=dbms_sql.last_sql_function_code;
lrowid:=dbms_sql.last_row_id;
errc:=SQLCODE;
errm:=sqlerrm;
dbms_output.put_line('Error '||to_char(errc)||' Posn '||to_char(errpsn)||' SQL fCode '||to_char(sqlfcd)||' rowid '||rowidtochar(lrowid));
raise_application_error(-20000,errm);
end;
begin
loop
--fetch_rows(c in integer):对游标进行循环取数据,并返回一个整数,
--为0时表示已经取到游标末端
if dbms_sql.fetch_rows(cid)>0 then
begin
--column_value(c in integer, position in integer, value):
--将所取得的游标数据赋值到相应的变量,c为游标,position为位置,
--value则为对应的变量;
dbms_sql.column_value(cid,1,request_id);
dbms_sql.column_value(cid,2,deal_name);
dbms_sql.column_value(cid,3,member_name);
dbms_output.put_line(request_id||'---'||deal_name||'---'||member_name);
row_count:=row_count+1;
if row_count=2 then
begin
--TempSql := 'insert into ' || totab || ' values(:r_no, :i_interval, :i_time, :i_index)';
cid_DDL:=dbms_sql.open_cursor; ddlsql:='insert into test_insert(inner_id,request_id,deal_name,member_name) values(100,:request_id,:deal_name,:member_name)'; dbms_sql.parse(cid_DDL,ddlsql,dbms_sql.native); dbms_sql.bind_variable(cid_DDL,'request_id',request_id); dbms_sql.bind_variable(cid_DDL,'deal_name',deal_name); dbms_sql.bind_variable(cid_DDL,'member_name',member_name); ddlrows:=dbms_sql.execute(cid_DDL); commit; dbms_sql.close_cursor(cid_DDL); end; end if; end; else begin commit; exit; end; end if; end loop; end; exception when others then errpsn:=dbms_sql.last_error_position; sqlfcd:=dbms_sql.last_sql_function_code; lrowid:=dbms_sql.last_row_id; errc:=SQLCODE; errm:=sqlerrm; dbms_output.put_line('Error '||to_char(errc)||' Posn '||to_char(errpsn)||' SQL fCode '||to_char(sqlfcd)||' rowid '||rowidtochar(lrowid)); raise_application_error(-20000,errm); -----------关闭cursor begin dbms_sql.close_cursor(cid); exception-----关闭时异常处理 when others then errpsn:=dbms_sql.last_error_position; sqlfcd:=dbms_sql.last_sql_function_code; lrowid:=dbms_sql.last_row_id; errc:=SQLCODE; errm:=sqlerrm; dbms_output.put_line('Error '||to_char(errc)||' Posn '||to_char(errpsn)||' SQL fCode '||to_char(sqlfcd)||' rowid '||rowidtochar(lrowid)); raise_application_error(-20000,errm); end; end pro_insert_dbms;