两种情况:
一:简单的动态SQL文,其通过字符串拼起来的。 执行方式:EXECUTE IMMEDIATE vc_sql 后面也可以跟上INTO 将检索到的值保存到变量中去。
例子: vc_sql_sub_1 VARCHAR(1024) := '';
nm_datacount_sub NUMBER := 0;
vc_sql_sub_1 :=' SELECT COUNT(KEIREN_NO) FROM TW_HOKAN_KEISANMOTO '
EXECUTE IMMEDIATE vc_sql_sub_1 INTO nm_datacount_sub;
补充: 项目的教训。
在动态拼成的SQL,如果拼入的变量有特殊符号的时候 例如:,&时,不要将其直接拼到SQL文中而是作为引数。
利用 EXECUTE IMMEDIATE USING (变量值);进行传递。
上面只是个简单例子,通常SQL文需要根据PLSQL的参数来确定的。
二:动态CURSOR。其的执行需要系统包【DBMS_SQL】的帮助。
过程是:1,根据要求拼写相应的SQL文
2,利用 DBMS_SQL中OPEN_CURSOR的方法打开一个CURSOR。用法 DBMS_SQL.OPEN_CURSOR 放回值为一个INTEGER类型的整数。
3,然后用DBMS_SQL包中的PARSE方法,将上面两则联系起来。用法 DBMS_SQL.PARSE(2返回的整数,1的SQL文,DBMS_SQL.NATIVE),其中第三个参数是编译SQL文的编译器版本。一般就用 DBMS_SQL.NATIVE
4,接下来是定义列 DBMS_SQL.DEFINE_COLUMN(2返回的整数,顺序,列名,长度)如果列名类型是NUMBER的话就不需要制定长度。VARCHAR可定要制定。其他数据类型没试过。
5,执行2定义的CURSOR DBMS_SQL.EXECUTE(2返回的整数)。
6,就是循环去取CURSOR 中的数据。取数据的方法 DBMS_SQL.FETCH_ROWS(2返回的整数)。如果返回0 说明已经到头了,可以EXIT了。 取具体的值 DBMS_SQL.COLUMN_VALUE(2返回的整数, 顺序, 变量名);
ps:操作2中返回的那个整数应该是(游标【CURSOR】的ID)
最后别忘了关闭游标【CURSOR】 DBMS_SQL.close_cursor(2返回的整数)
方法2: 1.定义一个系统CURSOR(SYS_REFCURSOR) 例如 1_refcur SYS_REFCURSOR;
2.定义一个变量类型为SQL文执行后,取得数据record类型的变量 TYPE 1_rec IS RECORD
3. OPEN 1_refcur FOR vc_sql;
LOOP
FETCH cr_hokan_keisanmoto_refcur INTO 1_rec ;
EXIT WHEN cr_hokan_keisanmoto_refcur%NOTFOUND;
END LOOP;
CLOSE 1_refcur ;