最近在写一个procedure时,需要动态定义一个table类型, 这个table类型是与一个表结构相同,但这个表名是由参数来传入的,并不确定,这就需要用动态PLSQL来实现此功能:
CREATE OR REPLACE PROCEDURE QUERY_STATION (
QUERY_TEXT VARCHAR2,TAB_NAME VARCHAR2
) AS
-- TYPE stacurtyp IS REF CURSOR;
-- TYPE station_type IS TABLE OF STATIONSSTATISTICSINFO%ROWTYPE;
-- station_tab station_type;
-- c_station stacurtyp;
pl_sql_stmt VARCHAR2(2000);
sql_stmt VARCHAR2(2000) :='select * from '||tab_name||' where 1=2 ';
CURSOR c_col_name IS SELECT column_name FROM user_tab_columns WHERE table_name=tab_name and data_type='VARCHAR2';
-- row_STATIONSSTATISTICSINFO STATIONSSTATISTICSINFO%rowtype;
BEGIN
--构造查询sql
FOR item IN c_col_name
LOOP
sql_stmt := sql_stmt||' or '|| item.column_name ||' like ''%'||QUERY_TEXT||'%''' ;
END LOOP;
DBMS_OUTPUT.PUT_LINE(sql_stmt);
--构造动态PL/SQL程序块,定义游标变量,输出查询结果集
pl_sql_stmt :='DECLARE '||
'TYPE station_type IS TABLE OF '||TAB_NAME||'%ROWTYPE;'||
'station_tab station_type;'||
'TYPE stacurtyp IS REF CURSOR;'||
'c_station stacurtyp;'||
'begin '||
'OPEN c_station FOR '||sql_stmt||';'||
'FETCH c_station BULK COLLECT INTO station_tab;'||
'IF station_tab.count>0 THEN '||
'FOR i IN station_tab.FIRST .. station_tab.LAST '||
'loop DBMS_OUTPUT.PUT_LINE(station_tab(i).STATIONSNAME);'||
'END LOOP;'||
'END IF;'||
'END;';
DBMS_OUTPUT.PUT_LINE(pl_sql_stmt);
--执行上面的PLSQL块
EXECUTE IMMEDIATE pl_sql_stmt;
END;
/
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10972173/viewspace-700359/,如需转载,请注明出处,否则将追究法律责任。