由于动态SQL 特有的灵活性,我们很容易的按照某种共性去构造通用和重用功能的代码,例如基于某个表的动态字段查询;
但凡事有利有弊;首先动态SQL 语句无法在编译前期检查SQL 是否正确,必须等到运行期才会发现问题;其次静态SQL 是一次解析,多次执行,虽然动态SQL 也可以使用绑定变量的方式,但是也会带来一些意想不到的性能问题,例如绑定变量在SQL 要访问的表存在数据倾斜时会提供错误的执行计划;最后动态SQL 语句可读性较差,比较难以维护。
下面我们就以比较经典的分页功能为例:
CREATE OR REPLACE Procedure sp_exec_dynamic_page
(
i_tablename VARCHAR2, -- 表名 employees e,departments d
i_tablecolumn VARCHAR2, -- 查询列 a.employee_id,b.department_name
i_where VARCHAR2, -- 查询条件 b.department_name like 'S%'
i_ordercolumn VARCHAR2, -- 排序 b.department_name desc
i_pagesize NUMBER, -- 每页大小 20
i_curpage NUMBER, -- 当前页 6
o_rowcount OUT NUMBER, -- 返回总条数
o_pagecount OUT NUMBER, -- 返回总页数
o_cursor OUT ref_cursor.t_RetDataSet -- 返回分页结果集
)
IS
v_startrecord INT;
v_endrecord INT;
v_pagesize INT;
v_curpage INT;
v_tablecolumn VARCHAR2(2000);
v_where VARCHAR2(2000);
v_ordercolumn VARCHAR2(200);
v_count_sql VARCHAR2(2000);
v_select_sql VARCHAR2(2000);
BEGIN
-- 如果没有表名称,则直接返回异常消息
-- 如果没有字段,则表示全部字段
IF i_tablecolumn IS NOT NULL THEN
v_tablecolumn:=i_tablecolumn;
ELSE
v_tablecolumn:=' * ';
END IF;
-- 可以没有 WHERE 条件
IF i_where IS NOT NULL THEN
v_where:=' WHERE 1=1 AND '||i_where||' ';
ELSE
v_where:=' WHERE 1=1 ';
END IF;
-- 可以没有ORDER BY 条件
IF i_ordercolumn IS NULL THEN
v_ordercolumn:=' ';
ELSE
v_ordercolumn:=' ORDER BY '||i_ordercolumn;
END IF;
-- 如果未指定查询页,则默认为首页
IF i_curpage IS NULL OR i_curpage<1 THEN
v_curpage:=1;
ELSE
v_curpage:=i_curpage;
END IF;
-- 如果未指定每页记录数,则默认为10 条记录
IF i_pagesize IS NULL THEN
v_pagesize:=10;
ELSE
v_pagesize:=i_pagesize;
END IF;
-- 查询总条数
v_count_sql:='SELECT COUNT(*) FROM '||i_tablename||v_where;
-- 构造最核心的查询语句
v_select_sql:='(SELECT '||v_tablecolumn||' FROM '||i_tablename||v_where||v_ordercolumn||') e';
-- 执行查询, 查询总条数
EXECUTE IMMEDIATE v_count_sql INTO o_rowcount;
DBMS_OUTPUT.PUT_LINE(' 查询总条数SQL=>'||v_count_sql);
DBMS_OUTPUT.PUT_LINE(' 查询总条数Count='||o_rowcount);
-- 得到总页数,并进行处理
IF MOD(o_rowcount,i_pagesize)=0 THEN
o_pagecount:=o_rowcount/i_pagesize;
ELSE
o_pagecount:=FLOOR(o_rowcount/i_pagesize)+1;
END IF;
-- 如果当前页大于最大页数,则取最大页数
IF i_curpage>o_pagecount THEN
v_curpage:=o_pagecount;
END IF;
-- 设置开始结束的记录数
v_startRecord := (v_curpage - 1) * v_pagesize + 1;
v_endRecord := v_curpage * v_pagesize;
-- 进行完整的动态SQL 语句拼写
v_select_sql:='SELECT * FROM '||
'( '||
' SELECT e.*,ROWNUM rn '||
' FROM '||
v_select_sql||
' WHERE ROWNUM<='||v_endRecord||
') '||
' WHERE rn>='||v_startRecord;
DBMS_OUTPUT.PUT_LINE(' 查询SQL=>'||v_select_sql);
OPEN o_cursor FOR v_select_sql;
END;
分享到:
相关推荐
根据给定文件的信息,以下是对“Oracle动态SQL4方法分析与应用.pdf”文档中所涉及知识点的详细说明: Oracle动态SQL技术: 动态SQL技术允许在程序执行时根据用户的输入构造SQL语句,它在编写程序时不需要确定具体的...
Oracle数据库作为当前企业级应用中广泛使用的数据库系统之一,其提供的动态SQL功能允许开发者在程序运行时构造和执行SQL语句,这种灵活性为程序开发提供了极大的便利。本文将探讨Oracle中的动态SQL实现机制,重点...
Oracle动态SQL是数据库编程中的一种技术,它允许在运行时构建和执行SQL语句,而不是在编译时确定。这在处理不确定的数据操作或者需要根据用户输入或程序逻辑动态生成SQL语句时非常有用。Oracle数据库提供了多种方式...
oracle动态sql例子,适用于存储过程中拼接sql
在Oracle数据库管理中,动态执行SQL语句是一种强大的功能,允许开发者在运行时构建和执行SQL语句,这对于处理不确定或变化的数据结构尤其有用。本文将深入探讨Oracle中动态执行SQL的四种主要方法,并通过具体示例...
Oracle数据库系统提供了对动态SQL的支持,这是一种在程序运行时构建和执行SQL语句的编程技术,对于实现数据库操作的灵活性具有重要作用。本文将探讨Oracle本地动态SQL的使用方法和技巧。 动态SQL的使用场景广泛,它...
### 基于Oracle高性能动态SQL程序开发 #### 一、引言 在现代数据库管理系统中,Oracle以其强大的功能和广泛的适用性而受到许多企业和开发者的青睐。在Oracle的编程环境中,动态SQL作为一种灵活的解决方案,能够...
动态 SQL 技术是一种高级的程序设计技术, 在程序开发 时,不知道要使用哪些字段或查询条件,而在程序执行时才能 构造出来。 遇到这种情况时使用动态 SQL 技术就能很好的满 足要求,这种技术具有很好的通用性,功能...
"msmmPrj.rar_The Oracle_oracle dynamic sql"这个压缩包文件很可能包含了关于使用Oracle动态SQL的详细教程或项目代码,特别是通过SQLDA(SQL Descriptor Area)进行数据交互的方法。 SQLDA,全称为SQL描述符区域,...
### Oracle 动态 SQL 执行详解 在 Oracle 数据库中,动态 SQL 提供了一种灵活的方式来执行不预先定义好的 SQL 语句。这种方式允许开发者在运行时构建 SQL 语句并执行它们,这对于处理未知数据结构或需要动态生成...
oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具...
Oracle和SqlServer语法区别 Oracle和SqlServer是两种流行的关系型数据库管理系统,它们之间存在着一些语法区别。了解这些区别对于开发者来说非常重要,因为它可以帮助他们更好地迁移到新的数据库管理系统。下面将...
Oracle数据库中的动态SQL应用方法是开发高效数据库查询程序的关键技术之一。动态SQL允许在程序运行时根据需要构建和执行SQL语句,增强了程序的灵活性和适应性,特别适合处理不确定或变化的数据操作需求。本文主要...
在Oracle数据库的开发中,动态SQL扮演着重要的角色,尤其在处理不确定的或复杂的查询需求时。动态SQL与静态SQL的主要区别在于,静态SQL在编译时即确定了SQL语句,而动态SQL则在运行时根据条件构建和执行。Oracle的PL...
### Oracle SQL Developer 使用教程 #### 一、Oracle Database Home Page 的使用 在开始介绍 Oracle SQL Developer 的使用之前,我们先来看看如何使用 Oracle Database Home Page。这部分内容非常重要,因为它是...
Oracle与SQLServer的SQL语法差异,用简单易懂的语言和实例对Oracle和Sql Server语法之间的差异进行了对比分析,更加适用于入门的人
Oracle数据库SQL语句跟踪器,通常被称为SQL Monitor,是一种强大的工具,用于监控和分析数据库中的SQL语句执行情况。在Oracle环境中,理解SQL语句的行为是优化数据库性能的关键。SQL Monitor提供实时视图,帮助DBA...
对ORACLE-SQL进行一些布局优化,更新它的格式
1. oraociei11.dll:这是Oracle Call Interface (OCI) 的动态链接库,是Oracle数据库访问接口的核心,用于应用程序与Oracle数据库交互。 2. orannzsbb11.dll:这是Oracle Net Services的缓冲区管理器,负责数据在...