1、执行诸如DDL和DDL语句(select除外)
a)打开一个游标
b)分析要执行的语句
c)绑定可能需要的任何输入变量
d)执行语句
e)关闭游标

select语句的执行如下:
set serveroutput
on;
declare

v_cursorid
number;

v_selectrecords
varchar2(
500);

v_numrows
integer;

v_mynum
integer;

v_mytext
varchar(
50);
begin

v_cursorid :
= dbms_sql.open_cursor;

v_selectrecords :
= 'select * from mytable';

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

dbms_sql.define_column(v_cursorid,
1,v_mynum);

dbms_sql.define_column(v_cursorid,
2,v_mytext,
50);

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_mynum);

dbms_sql.column_value(v_cursorid,
2,v_mytext);

dbms_output.put_line(v_mynum
||' '||v_mytext);
end loop;

dbms_sql.close_cursor(v_cursorid);
end;
/
2、select查询的动态sql实现
a)打开一个游标
b)分析要执行的语句
c)绑定可能需要的任何输入变量(如果需要)
4)定义输出变量
d)执行语句
5)取回记录
6)将取回的记录结果存储在pl/sql变量中
e)关闭游标

create语句的例子如下
declare

v_cursorid
number;

v_createTableString
varchar2(
500);

v_numrows
integer;
begin

v_cursorid :
= dbms_sql.open_cursor;

v_createTableString :
= 'create table mytable(myrow integer,mydesc varchar2(50)) tablespace tabs';

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;
/

insert语句的例子如下
set serveroutput
on;
declare

v_cursorid
number;

v_insertRecords
varchar2(
500);

v_numrows
integer;
begin

v_cursorid :
= dbms_sql.open_cursor;

v_insertRecords :
= 'insert into mytable values(:mynum,:mytext)';

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

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

dbms_sql.bind_variable(v_cursorid,
':mytext',
'one');

v_numrows :
= dbms_sql.
execute(v_cursorId);

dbms_output.put_line(v_numrows);
--di 2 tiao ji lu

dbms_sql.bind_variable(v_cursorid,
':mynum',
2);

dbms_sql.bind_variable(v_cursorid,
':mytext',
'two');

v_numrows :
= dbms_sql.
execute(v_cursorId);

dbms_output.put_line(v_numrows
||'2');

exception
when others
then raise;

dbms_sql.close_cursor(v_cursorid);
commit;
end;
/
3、执行pl/sql匿名块
a)打开一个游标
b)分析要执行的语句
c)绑定可能需要的任何输入变量(如果需要)
d)执行语句
5)取回记录
6)将取回的记录结果存储在pl/sql变量中
e)关闭游标

执行匿名块
set serveroutput
on;
declare

v_cursorid
number;

v_matchrecord
varchar2(
500);

v_numrows
integer;

v_mynum
integer;

v_mytext
varchar2(
50);
begin

v_cursorid :
= dbms_sql.open_cursor;

v_matchrecord :
= 'begin
select myrow,mydesc into :myrow ,:mytext from mytable
where myrow = 2;
end;';

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

dbms_sql.bind_variable(v_cursorid,
':myrow',v_mynum);

dbms_sql.bind_variable(v_cursorid,
':mytext',v_mytext,
50);

v_numrows :
= dbms_sql.
execute(v_cursorid);

dbms_sql.variable_value(v_cursorid,
':myrow',v_mynum);

dbms_sql.variable_value(v_cursorid,
':mytext',v_mytext);

dbms_output.put_line(v_mynum
||' '||v_mytext);

dbms_sql.close_cursor(v_cursorid);
end;
/

检查取回记录的进度
set serveroutput
on;
declare

v_cursorid
number;

v_matchrecord
varchar2(
500);

v_numrows
integer;

v_mynum
integer;

v_mytext
varchar2(
50);

v_myrowid rowid;

v_totrow
integer;
begin

v_cursorid :
= dbms_sql.open_cursor;

v_matchrecord :
= 'select * from mytable for update';

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

dbms_sql.define_column(v_cursorid,
1,v_mynum);

dbms_sql.define_column(v_cursorid,
2,v_mytext,
50);

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_mynum);

dbms_sql.column_value(v_cursorid,
2,v_mytext);

dbms_output.put_line(v_mynum
||' '||v_mytext);
end loop;

dbms_sql.close_cursor(v_cursorid);
end;
/