1.建立測試表:
create table AAA ( aa NVARCHAR2(100), bb NVARCHAR2(100), cc NVARCHAR2(100), dd NVARCHAR2(100) ) 並導入測試數據insert into aaa values('1','1','1','1');
2.測試可行性:
DECLARE v_cursor NUMBER; v_stat NUMBER; aa VARCHAR(100); bb VARCHAR(100); cc VARCHAR(100); dd VARCHAR(100); v_sql VARCHAR(200); BEGIN v_sql :='select * from aaa'; v_cursor := dbms_sql.open_cursor; --打開游標; dbms_sql.parse(v_cursor, v_sql, dbms_sql.native); --解析動態SQL語句; dbms_sql.define_column(v_cursor, 1, aa,100); --定義列 dbms_sql.define_column(v_cursor, 2,bb, 100); dbms_sql.define_column(v_cursor, 3,cc,100); dbms_sql.define_column(v_cursor, 4, dd,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, aa); --將當前行的查詢結果寫入上面定義的列中。 dbms_sql.column_value(v_cursor, 2, bb); dbms_sql.column_value(v_cursor, 3,cc); dbms_sql.column_value(v_cursor, 4, dd); dbms_output.put_line(aa || ';' || bb || ';' || cc || ';'|| dd); END LOOP; dbms_sql.close_cursor(v_cursor); --關閉游標。 END; 輸出1,1,1,1
3.建立存儲過程,其中,sql為輸入參數,系統引用游標為輸出參數,如下:
create or replace procedure myproc ( mysqlval in varchar2, rescur out sys_refcursor ) as BEGIN open rescur for mysqlval; END;
4.測試存儲過程
sqlplus中,執行如下:
var r refcursor; exec proc2('select * from aaa',:r); print r;
輸出是正常的