ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 使用动态PL/SQL

使用动态PL/SQL

原创 Linux操作系统 作者:lsq_008 时间:2011-06-21 10:24:48 0 删除 编辑
最近在写一个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/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 自治事务---函数
请登录后发表评论 登录
全部评论
十余年大型金融及电信系统数据库管理经验,曾服务于中国建设银行、中国移动。对oracle,mysql数据库有深入了解。 擅长python开发,独立开发了开源数据库自动化监控运维平台Power Monitor。

注册时间:2008-02-29

  • 博文量
    325
  • 访问量
    1254577