ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 4378|回复: 8

问一个PLSQL编程的问题

[复制链接]
论坛徽章:
180
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39马上有车
日期:2014-02-18 16:41:11马上有钱
日期:2014-11-24 15:17:08马上有钱
日期:2014-11-12 09:33:24马上有房
日期:2014-11-07 08:46:05马上有钱
日期:2014-10-27 09:26:57马上有对象
日期:2014-10-28 10:28:08itpub13周年纪念徽章
日期:2014-10-10 10:38:25马上有对象
日期:2015-01-14 17:33:15
发表于 2017-6-20 09:22 | 显示全部楼层 |阅读模式
我有1一个脚本要在11g,12c都可以运行.他们分别调用的包在11g,12c都不一样.如何实现.
比如:
--如下这样写是不行的.在11g下.
        dbms_utility.expand_sql_text(     -- 12c
                     *
ERROR at line 15:
ORA-06550: line 15, column 22:
PLS-00302: component 'EXPAND_SQL_TEXT' must be declared
ORA-06550: line 15, column 9:
PL/SQL: Statement ignored
SP2-1504: Cannot print uninitialized LOB variable "M_SQL_OUT"
--//问一下pl sql支持类似宏的东西吗?

variable m_sql_out clob

declare
    m_sql_in  clob ;
    version varchar2(3);
begin
    select regexp_replace(version,'\..*') into version from v$instance;
    if version = '11' then
        select sql_fulltext into m_sql_in from v$sqlarea where sql_id='&&1';
        dbms_sql2.expand_sql_text(        -- 11g
                m_sql_in,
                :m_sql_out
        );
    end if;
    if version = '12' then
        select sql_fulltext into m_sql_in from v$sqlarea where sql_id='&&1';
        dbms_utility.expand_sql_text(     -- 12c
                m_sql_in,
                :m_sql_out
        );
    end if;
end;
/
set long 20000
column m_sql_out format a160
print m_sql_out



论坛徽章:
263
乌索普
日期:2016-07-29 01:46:29射手座
日期:2016-05-26 14:02:50双子座
日期:2016-05-25 16:05:44白羊座
日期:2016-05-23 11:49:19双鱼座
日期:2016-04-29 17:13:05秀才
日期:2016-04-29 15:03:39秀才
日期:2016-04-29 15:04:10技术图书徽章
日期:2016-04-29 15:04:10秀才
日期:2016-03-28 10:21:13巨蟹座
日期:2016-03-26 21:14:25
发表于 2017-6-20 11:15 | 显示全部楼层
支持条件编译,不过自己判断版本也可以啊

使用道具 举报

回复
论坛徽章:
263
乌索普
日期:2016-07-29 01:46:29射手座
日期:2016-05-26 14:02:50双子座
日期:2016-05-25 16:05:44白羊座
日期:2016-05-23 11:49:19双鱼座
日期:2016-04-29 17:13:05秀才
日期:2016-04-29 15:03:39秀才
日期:2016-04-29 15:04:10技术图书徽章
日期:2016-04-29 15:04:10秀才
日期:2016-03-28 10:21:13巨蟹座
日期:2016-03-26 21:14:25
发表于 2017-6-20 11:36 | 显示全部楼层
本帖最后由 solomon_007 于 2017-6-20 11:46 编辑

利用动态PLSQL:

create or replace function fn_get_expand_sql (p_sql_id in varchar2)
  return clob
  is
    l_version varchar2(3) := null;
    l_sqltext clob := null;
    l_sql     clob := null;
    l_result  clob := null;
  begin
    select regexp_replace(version,'\..*')
      into l_version
      from v$instance;

    select sql_fulltext
      into l_sqltext
      from v$sqlarea
     where sql_id = p_sql_id;

    if l_version = '11' then

       l_sql := 'begin
                   dbms_sql2.expand_sql_text( :a,:b );
                 end;';

       execute immediate l_sql using in l_sqltext,out l_result;

    elsif l_version = '12' then

      l_sql := 'begin
                  dbms_utility.expand_sql_text(:a,:b);
                end;';

      execute immediate l_sql using in l_sqltext,out l_result;

    end if;

    return l_result;

  end;

select fn_get_expand_sql('1sddtpppxc00g') from dual

使用道具 举报

回复
论坛徽章:
263
乌索普
日期:2016-07-29 01:46:29射手座
日期:2016-05-26 14:02:50双子座
日期:2016-05-25 16:05:44白羊座
日期:2016-05-23 11:49:19双鱼座
日期:2016-04-29 17:13:05秀才
日期:2016-04-29 15:03:39秀才
日期:2016-04-29 15:04:10技术图书徽章
日期:2016-04-29 15:04:10秀才
日期:2016-03-28 10:21:13巨蟹座
日期:2016-03-26 21:14:25
发表于 2017-6-20 11:43 | 显示全部楼层
l_sql 定义应该改成这样 l_sql     clob := null;

使用道具 举报

回复
论坛徽章:
180
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39马上有车
日期:2014-02-18 16:41:11马上有钱
日期:2014-11-24 15:17:08马上有钱
日期:2014-11-12 09:33:24马上有房
日期:2014-11-07 08:46:05马上有钱
日期:2014-10-27 09:26:57马上有对象
日期:2014-10-28 10:28:08itpub13周年纪念徽章
日期:2014-10-10 10:38:25马上有对象
日期:2015-01-14 17:33:15
 楼主| 发表于 2017-6-20 15:57 | 显示全部楼层
本帖最后由 lfree 于 2017-6-20 16:03 编辑
solomon_007 发表于 2017-6-20 11:36
利用动态PLSQL:

create or replace function fn_get_expand_sql (p_sql_id in varchar2)

我不想定义成函数,我这样那个改写为什么没有输出呢?
噢仔细看才发现自己写错了一个地方.现在ok了.红色那里原来写成了l_sql.

set long 20000
set serveroutput on
declare
    L_sqltext clob := null;
    l_version varchar2(3) := null;
    l_sql     clob := null;
    l_result  clob := null;
begin
    select regexp_replace(version,'\..*') into l_version from v$instance;
    select sql_fulltext into l_sqltext  from v$sqlarea where sql_id='&&1';

    if l_version = '11' then
       l_sql := 'begin
                   dbms_sql2.expand_sql_text( :a,:b );
                 end;';

    elsif l_version = '12' then

      l_sql := 'begin
                  dbms_utility.expand_sql_text(:a,:b);
                end;';
    end if;
    execute immediate l_sql using in l_sqltext,out l_result;
    dbms_output.put_line(l_result);
end;
/
set serveroutput off


使用道具 举报

回复
论坛徽章:
180
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39马上有车
日期:2014-02-18 16:41:11马上有钱
日期:2014-11-24 15:17:08马上有钱
日期:2014-11-12 09:33:24马上有房
日期:2014-11-07 08:46:05马上有钱
日期:2014-10-27 09:26:57马上有对象
日期:2014-10-28 10:28:08itpub13周年纪念徽章
日期:2014-10-10 10:38:25马上有对象
日期:2015-01-14 17:33:15
 楼主| 发表于 2017-6-20 16:04 | 显示全部楼层
谢谢solomon_007的指点....

使用道具 举报

回复
论坛徽章:
263
乌索普
日期:2016-07-29 01:46:29射手座
日期:2016-05-26 14:02:50双子座
日期:2016-05-25 16:05:44白羊座
日期:2016-05-23 11:49:19双鱼座
日期:2016-04-29 17:13:05秀才
日期:2016-04-29 15:03:39秀才
日期:2016-04-29 15:04:10技术图书徽章
日期:2016-04-29 15:04:10秀才
日期:2016-03-28 10:21:13巨蟹座
日期:2016-03-26 21:14:25
发表于 2017-6-20 16:37 | 显示全部楼层
lfree 发表于 2017-6-20 16:04
谢谢solomon_007的指点....

不客气啊,我们都是海区的常客。。。

使用道具 举报

回复
认证徽章
论坛徽章:
8
ITPUB9周年纪念徽章
日期:2010-10-08 09:31:22SQL大赛参与纪念
日期:2011-04-13 12:08:17ITPUB十周年纪念徽章
日期:2011-11-01 16:25:222013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09秀才
日期:2016-03-24 09:10:24秀才
日期:2016-12-05 11:16:06
发表于 2017-7-25 11:30 | 显示全部楼层
有专门的语法处理这些事情
  1. $if dbms_db_version.ver_le_10_2 $then
  2. $elsif dbms_db_version.ver_le_12_1 $then
  3. $end
复制代码

使用道具 举报

回复
论坛徽章:
180
红宝石
日期:2014-05-09 08:24:37萤石
日期:2014-01-03 10:25:39马上有车
日期:2014-02-18 16:41:11马上有钱
日期:2014-11-24 15:17:08马上有钱
日期:2014-11-12 09:33:24马上有房
日期:2014-11-07 08:46:05马上有钱
日期:2014-10-27 09:26:57马上有对象
日期:2014-10-28 10:28:08itpub13周年纪念徽章
日期:2014-10-10 10:38:25马上有对象
日期:2015-01-14 17:33:15
 楼主| 发表于 2017-7-25 22:35 | 显示全部楼层
qqjue 发表于 2017-7-25 11:30
有专门的语法处理这些事情

谢谢指点,明天测试看看.

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表