【Oracle APEX开发小技巧3】Oracle apex pl/sql动态拼接的注意点和技巧

news2024/10/5 13:33:44

【开发小技巧】在开发过程中使用动态拼接进行sql查询及需要注意的点

在开发过程中,我们经常需要根据不同的条件执行不同的SQL查询。例如,当权限类型为0(非超级管理员权限)时,我们只能查询特定平台的数据;而当权限类型为1(超级管理员权限)时,我们需要查询所有平台的数据。为了实现这个效果,我们可以使用动态拼接进行SQL查询,并根据用户权限进行展示。

具体来说,我们可以编写一个PL/SQL代码块,根据权限类型和平台名称生成一个JSON字符串。首先,我们需要判断权限类型是否为0,如果是,则在查询条件中添加平台名称;否则,不添加任何条件。然后,我们将生成的JSON字符串返回。

以下是一个简单的示例代码:

declare 
sql2 VARCHAR2(100);
json2 VARCHAR2(1000);
begin

IF V('PERMISSION_TYPE') = 0 THEN sql2 := ' and BASE_NAME = '''||V('PLATFORM_NAME')||'''';
-- IF V('PERMISSION_TYPE') = 0 THEN sql2 := ' and BASE_NAME = ''晶澳总部''';
-- IF V('PERMISSION_TYPE') = 0 THEN sql2 := 'and BASE_NAME = :PLATFORM_NAME';
END IF;
json2 := 'select ZJ_OUTPUT_INPUT_ID,
       TENANT_ID,
       REVISION,
       CREATED_BY,
       CREATED_TIME,
       UPDATED_BY,
       UPDATED_TIME,
       BASE_NAME,
       WORKSHOP,
       PRODUCT_TYPE,
       RUKU_MW,
       RUKU_QTY,
       SCRAP_NUMBER,
       CALENDAR_DATE,
       CALENDAR_STR,
       LINE_NUMBER
  from DATA_SHARE_ZJ_OUTPUT_INPUT
  where  is_enable = 0 and TENANT_ID = :USER_TENANT' ||sql2;
return 
json2
;
end; 
 

通过使用动态拼接进行SQL查询,我们可以根据用户权限灵活地构建查询语句,从而实现不同条件下的数据展示。

超级管理员权限效果(可以全查平台):

非超级管理员权限效果(仅可查询当前平台):

需要注意的点

但是要注意sql2的and前要打空格,否则拼接后会变成
where is_enable = 0 and TENANT_ID = :USER_TENANTand xxx 会报错

扩展

Oracle Apex PL/SQL动态拼接的注意点:

  1. 拼接的基本规范

    • 所有通过 || 连接的对象都应是 VARCHAR2 类型,数字会自动转换,但 DATE 需要手动使用 TO_CHAR 函数转换。
    • 单引号的使用遵循就近原则,即从第二个单引号开始被视为转义符。
    • 对于每个包含单引号的字符串,都需要写成两个连续的单引号来进行转义。
  2. 处理特殊字符和字符串

    • 可以使用 CHR(39) 来转义单引号,避免手动重复书写单引号。
    • 当涉及到 DATE 类型的字段时,需要在 SQL 语句中将字符串转换回 DATE 类型进行比较,这通常需要 TO_DATE 函数。
  3. 动态执行SQL语句

    • 使用 EXECUTE IMMEDIATE 可以动态执行拼接后的 SQL 语句,这使得 SQL 更加灵活。
    • 使用 BIND 变量可以提高 SQL 的性能和安全性,避免 SQL 注入攻击。
  4. 错误处理与调试

    • 在拼接 SQL 的过程中,应该加入异常处理机制,以便于捕获和处理可能出现的错误。
    • 可以利用 DBMS_OUTPUT 或 HTP.P 打印中间结果,帮助调试和验证 SQL 语句的正确性。
  5. 代码的可读性和维护性

    • 尽管动态 SQL 提供了灵活性,但过于复杂的拼接逻辑可能会降低代码的可读性和维护性。
    • 应尽量简化 SQL 语句的动态部分,必要时重构代码以提高清晰度。

Oracle Apex中使用PL/SQL进行动态拼接的技巧:

  1. 利用绑定变量提高性能和安全性

    • 绑定变量可以避免硬编码的值,提高 SQL 的执行计划的稳定性和性能。
    • 使用 USING 关键字可以将变量值安全地传递给动态 SQL,减少 SQL 注入的风险。
  2. 使用APEX_UTIL中的函数

    • APEX_UTIL 包中包含了许多用于创建区域的实用函数,可以简化区域创建过程。
    • 例如,使用 APEX_UTIL.CREATE_REGION 可以方便地创建新的区域。
  3. 处理动态内容和区域

    • 根据用户输入或其他运行时条件动态生成区域的内容,如根据用户的选择改变报告的内容。
    • 使用 PL/SQL 代码块可以根据需要添加、修改或删除页面项目和区域。
  4. 结合使用DBMS_SQL包

    • 对于复杂的 SELECT 语句,使用 DBMS_SQL 包可以更灵活地处理查询结果。
    • 描述游标中的列信息,循环提取查询结果,并进行处理或展示。
  5. 简化和优化 SQL 语句

    • 尽可能使用参数化查询而不是完全动态化的 SQL,以减少潜在的性能问题和安全风险。
    • 评估是否可以通过静态 SQL 达到相同的目的,从而避免不必要的复杂性。

综上所述,可以看到在Oracle APEX中运用PL/SQL进行动态拼接时需要注意的事项和可以采纳的技巧。理解这些基本点和高级技巧,可以帮助开发者有效地构建出功能强大且安全的数据库应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1858131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL----undo log回滚日志原理、流程以及与redo log比较

回滚日志 回滚日志,保存了事务发生之前的数据的一个版本,用于事务执行时的回滚操作,同时也是实现多版本并发控制(MVCC)下读操作的关键技术。 如何理解Undo Log 事务需要保证原子性,也就是事务中的操作要…

c++ 正则匹配得使用

标头&#xff1a;#include <regex> 相关函数&#xff1a; regex_match regex_replace regex_search 名称描述regex_match测试正则表达式是否与整个目标字符串相完全匹配。regex_replace替换匹配正则表达式。regex_search搜索正则表达式匹配项。 1. regex_search 成功搜…

Java开发-实际工作经验和技巧-0001-PostgreSQL数据库存储磁盘满了重启以及应急措施

Java开发-实际工作经验和技巧-0001-PostgreSQL数据库存储磁盘满了重启以及应急措施 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff0…

外贸行业 - 收汇日期

“收汇日期”指的是外贸业务中&#xff0c;出口方从进口方收到货款的具体日期。在外贸交易中&#xff0c;特别是使用信用证&#xff08;Letter of Credit, L/C&#xff09;、电汇&#xff08;Telegraphic Transfer, T/T&#xff09;、付款交单&#xff08;Documents against Pa…

SOLIDWORKS教育认证计划

当今职场竞争激烈&#xff0c;CAD专业人员需在各个方面拥有优势。SOLIDWORKS教育认证计划为学生和教师提供了一个机会&#xff0c;让他们能够通过SOLIDWORKS 3D实体建模软件、设计理念、可持续设计和对专业发展的投入来证明自身的专业水准。凭借这个行业标准认证&#xff0c;学…

122.网络游戏逆向分析与漏洞攻防-邮件系统数据分析-邮件物品箱的管理

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

【机器学习300问】130、什么是Seq2Seq?又叫编码器(Encoder)和解码器(Decoder)。

Seq2Seq&#xff0c;全称为Sequence to Sequence&#xff0c;是一种用于处理序列数据的神经网络模型&#xff0c;特别适用于如机器翻译、语音识别、聊天机器人等需要将一个序列转换为另一个序列的任务。这种模型由两部分核心组件构成&#xff1a;编码器&#xff08;Encoder&…

智源更新大模型排行榜:豆包大模型“客观评测”排名国产第一

6月中旬&#xff0c;智源研究院旗下的 FlagEval 大模型评测平台发布最新榜单&#xff1a;在有标准答案的“客观评测”中&#xff0c;GPT-4 以76.11分在闭源大模型中排名第一&#xff1b;Doubao-Pro&#xff08;豆包大模型&#xff09;以75.96分排名第二&#xff0c;同时也是得分…

lvs集群 Keepalived

Keepalived高可用集群 Keepalived概述 功能 LVS规则管理LVS集群真实服务器状态监测管理VIP Keepalived实现web高可用 安装keepalived软件 在webservers上配置 启动服务 webservers systemctl start keepalived.service ip a s | grep 192.168 #web1主机绑定vip 测试…

《互联网政务应用安全管理规定》深度解读

《互联网政务应用安全管理规定》的出台&#xff0c;对互联网政务应用的安全提出了一系列具体要求。 2024年5月15日&#xff0c;中央网信办、中央编办、工业和信息化部、公安部等四部门联合公布《互联网政务应用安全管理规定》&#xff08;以下称《规定》&#xff09;&#xff…

Windows资源管理器down了,怎么解

ctrlshiftesc 打开任务管理器 文件 运行新任务 输入 Explorer.exe 资源管理器重启 问题解决 桌面也回来了

Java数据结构4-链表

1. ArrayList的缺陷 由于其底层是一段连续空间&#xff0c;当在ArrayList任意位置插入或者删除元素时&#xff0c;就需要将后序元素整体往前或者往后搬移&#xff0c;时间复杂度为O(n)&#xff0c;效率比较低&#xff0c;因此ArrayList不适合做任意位置插入和删除比较多的场景…

使用 Reqable 在 MuMu 模拟器进行App抓包(https)

1、为什么要抓包&#xff1f; 用开发手机应用时&#xff0c;查看接口数据不能像在浏览器中可以直接通过network查看&#xff0c;只能借助抓包工具来抓包&#xff0c;还有一些线上应用我们也只能通过抓包来排查具体的问题。 2、抓包工具 实现抓包&#xff0c;需要一个抓包工具…

鸿蒙NEXT,保障亿万中国老百姓数据安全的操作系统

吉祥学安全知识星球&#x1f517;除了包含技术干货&#xff1a;Java代码审计、web安全、应急响应等&#xff0c;还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 上周华为发布了最新的鸿蒙NEXT操作系统&#xff0…

用Vue3打造一个交互式营养追踪仪表盘

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 Vue.js 构建营养仪表盘卡片 应用场景介绍 营养仪表盘卡片是一个可视化工具&#xff0c;用于跟踪个人的营养摄入情况。它通常包含以下信息&#xff1a; 卡路里摄入目标和进度营养成分&#xff08;如脂肪…

SwiftUI 6.0(iOS 18/macOS 15)关于颜色 Color 的新玩法

概览 WWDC 2024 重装升级的 SwiftUI 6.0 让 Apple 不同平台&#xff08;iOS 18/macOS 15&#xff09;显得愈发的冰壶玉衡、美轮美奂。 之前梦寐以求的颜色混合功能在 WWDC 24 里终于美梦成真啦&#xff01; 在本篇博文中&#xff0c;您将学到如下内容&#xff1a; 概览1. 梦想…

【CentOS 7】深入指南:使用LVM和扩展文件系统增加root分区存储容量

【CentOS 7】深入指南&#xff1a;使用LVM和扩展文件系统增加root分区存储容量 大家好 我是寸铁&#x1f44a; 【CentOS 7】深入指南&#xff1a;使用LVM和扩展文件系统增加root分区存储容量 ✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 在运行CentOS 7服务器或虚拟机时&a…

每日一题——Python代码实现PAT甲级1006 Sign In and Sign Out(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码点评 时间复杂度分析 空间复杂度分析 我要更强 优化建议 优化后的…

【总结】在SpringBoot项目中如何动态切换数据源、数据库?(可直接CV)

注意&#xff1a;文章若有错误的地方&#xff0c;欢迎评论区里面指正 &#x1f36d; 前言 本文参考若依源码&#xff0c;介绍了如何在SpringBoot项目中使用AOP和自定义注解实现MySQL主从数据库的动态切换&#xff0c;当从库故障时&#xff0c;能自动切换到主库&#xff0c;确…

国标GB28181视频汇聚平台EasyCVR设备展示数量和显示条数不符的原因排查与解决

国标GB28181/GA/T1400协议/安防综合管理系统EasyCVR视频汇聚平台能在复杂的网络环境中&#xff0c;将前端设备统一集中接入与汇聚管理。智慧安防/视频存储/视频监控/视频汇聚EasyCVR平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级…