oracle 預存程序執行可輸入sql語句並返回結果集,oraclesql
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;
輸出是正常的