曾有人说如果想使自己写的pl/sql粗造的话,在pl/sql中就不要使用联编变量!
1:可是我想请教诸位,如何就算使用了联编变量!
使用dbms_sql包动态执行sql语句(在语句中含有变量),就算使用了吗?
我又如何判断是否使用了联编变量?
2:我在pl/sql块中执行动态sql语句可以这样写吗?
declare v_Cursor integer ;
v_CurRet integer ;
v_SqlStr Varchar(1024);
begin
open 一游标
[color=blue:95a6c11e7d]v_Cursor := dbms_sql.open ;[/color:95a6c11e7d]
loop
fetch 一游标 into 变量 ;
Exit when .........
V_sqlStr := '...........'||变量;
dbms_sql.parse(v_Cursor,v_sqlStr,dbms_sql.native ) ;
v_CurRet := dbms_sql.execute(v_cursor) ;
...........
end loop ;
dbms_sql.close(v_Cursor) ;
end ;
我可以在一次open一个游标后,在循环中使用parse解析执行变化的sql语句吗!
还是应该把open,close语句放入循环之内,打开--解析--执行--关闭。
反正上述代码可以编译通过,也可以执行,就是我不知是否就算使用了联编变量?
【发表回复】【查看CU论坛原帖】【添加到收藏夹】【关闭】
| zhouok 回复于:2004-01-15 13:09:15
| 你这样用当然没有用到联编变量,要用dbms_sql.bind_variable 来处理.
方法如下:
--------------------------------------------------------------
declare
c number;
n number;
amount number:= 100;
BEGIN
c:= dbms_sql.open_cursor;
dbms_sql.parse(c, 'insert into accts values(''income'', :1)', dbms_sql.native);
dbms_sql.bind_variable(c, '1', amount);
n := dbms_sql.execute(c);
dbms_sql.close_cursor(c);
END;
| |
|