这个专门的方法用内部用了 dbms_sql包来实现insert 语句的操作。这样避免连接字符等麻烦。充分利用oracle 的特性.方便维护。
下面是我用dbms_sql 做更新和查询的试验示例。
declare
v_cursor number; --定义光标
v_string varchar2(2999);
v_row number;
begin
v_cursor:=dbms_sql.open_cursor;--打开处理光标
v_string := 'update ywyinfo set ywy=ywy where ywy=:name';--操作语句,其中:name是语句运行时才确定值的变量
dbms_sql.parse(v_cursor,v_string,dbms_sql.native);--解释语句
dbms_sql.bind_variable(v_cursor,':name','陆冠良'); --给变量赋值
v_row := dbms_sql.execute(v_cursor);--执行语句
dbms_sql.close_cursor(v_cursor);--关闭游标
dbms_output.put_line(v_row);
exception
when others then
dbms_sql.close_cursor(v_cursor); --关闭光标
raise;
end;
--查询
DECLARE
v_cursor NUMBER;
v_stat NUMBER;
v_row NUMBER;
v_sql VARCHAR(200);
yId number;
yName varchar2(100);
BEGIN
v_sql := 'SELECT * FROM ywyinfo WHERE ywy = :name';
v_cursor := dbms_sql.open_cursor; --打开游标;
dbms_sql.parse(v_cursor, v_sql, dbms_sql.native); --解析动态SQL语句;
dbms_sql.bind_variable(v_cursor, ':name', '陈翠兰'); --绑定输入参数;
dbms_sql.define_column(v_cursor, 1, yId); --定义列
dbms_sql.define_column(v_cursor, 2, yName, 100);
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, yId); --将当前行的查询结果写入上面定义的列中。 dbms_sql.column_value(v_cursor, 2, v_no);
dbms_sql.column_value(v_cursor, 2, yName);
dbms_output.put_line(yId || ';' || yName);
END LOOP;
dbms_sql.close_cursor(v_cursor); --关闭游标。
END;