热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

系统命名与SQL命名之争:访问数据库对象

执行SQL语句时,您可以使用系统命名规范或者SQL命名规范来运行它们。上一篇文章重点探讨了使用SQL和系统命名规范创建数据库对象时,所有权和访问权限之间的差异。

执行 SQL 语句时,您可以使用系统命名规范或者 SQL 命名规范来运行它们。上一篇文章重点探讨了使用 SQL 和系统命名规范创建数据库对象时,所有权和访问权限之间的差异。

本文将介绍系统命名与 SQL 命名在访问表和视图以及存储过程和用户定义的函数 (UDF) 时的行为差异,重点关注使用这些对象的非限定引用时的不同行为。

本文介绍了使用系统和 SQL 命名规范运行 SQL 语句时的不同行为。本系列的 第 1 部分 主要关注在使用 SQL 创建 IBM® DB2® 对象时,系统命名规范和 SQL 命名规范如何导致对象所有权和访问权限差异。

命名规范还会决定在使用模式显式限定 DB2 对象引用时,使用哪个字符来分隔模式与对象名称,系统命名 (*SYS) 使用的是斜杠 (/),而 SQL 命名 (*SQL) 使用的是圆点 (.)。

不过,IBM i 应用程序很少会通过显式指定模式名称的方式来访问 DB2 对象。这些应用程序依靠搜索库列表来查找恰当的对象。它们将使用在库列表中找到的第一个具有指定名称和适当对象类型的对象。在测试应用程序时,包含新程序和数据集的库会直接插入库列表的顶部。通过这种方式,即可轻松处理新旧程序的混合,轻松处理生产数据和测试数据。具有显式限定的模式引用的应用程序必须手动更改,然后才能在不同的环境中运行。

对于典型的 IBM i 应用程序,下面我们将根据访问 SQL 语句中指定的非限定对象的命名规范来分析不同的行为。

访问数据

持久用户数据仅存储在表中。表中的数据可直接访问,也可通过别名或视图间接访问。要在 SQL 语句中访问表、视图或别名,可以通过模式名称显式限定对象,也可以根据命名规范隐式解析模式名称。

数据访问方法

IBM DB2 for i 对象中的数据可通过某些高级语言(例如 RPG 或 COBOL)中使用的记录级访问接口进行访问和维护。

不过,SQL 是新近开发的 IBM i 应用软件和程序中访问数据的最常用接口。SQL 语句可作为 静态 或 动态 SQL 运行。静态 SQL 与动态 SQL 之间的主要区别取决于 SQL 语句本身的生成方式。

  • 静态 SQL 语句

包含嵌入式 SQL 的 SQL 例程或应用程序多使用静态 SQL 语句。静态 SQL 语句在程序或例程源代码中采用硬编码的形式。对于静态 SQL 语句来说,SQL 预编译器将检查 SQL 语法,评估对表和列的引用,并声明所有宿主变量的数据类型。SQL 预编译器也会根据 编译时使用的命名规范,确定运行时用于解析非限定数据库对象的模式。从性能的角度来看,使用静态 SQL 是最佳选择,因为有些步骤(例如,语法检查)是在编译时完成的。

清单 1. 静态 SQL 语句 展示了一个 RPG 程序内嵌入的静态 SQL 语句,该语句用于确定特定年份的订单数量。年份值将作为参数值 (ParYear) 传递给该过程。

清单 1.静态 SQL 语句

				
 
 	
	 D GetNbrOfOrders... 
	 D                 PI            10I 0 
	 D ParYear                        4P 0  Const 
	  ... 
	 D NbrOfOrders     S             10I 0 
	 /Free 
	  ... 
	    Exec SQL  Select  Count(*)        Into :NbrOfOrders 
	                from  Order_Header 
	                Where Year(OrderDate) = :ParYear; 
  • 动态 SQL 语句

动态 SQL 语句是在程序的运行时生成的。在构建完成后,动态 SQL 语句的语法会被检查,随后将其转为可执行的 SQL 语句,以便运行。

清单 2. 一个 SQL 例程中的动态 SQL 语句 展示了创建 UDF COUNT_NUMBER_OF_ROWS 的 SQL 脚本。使用这个函数,即可确定任意表、视图或别名中的行数。表(或者视图和别名)名称以及模式名称将作为参数值传递。调用该 UDF 时,会以字符串的形式生成所执行的 SQL 语句,其中包含传递的参数值。运行 PREPARE 语句将其转为可执行 SQL 语句,随后会检查该字符串的语法,最后使用 EXECUTE 语句执行该语句。由于编译时并不了解运行时会访问哪些表或模式,因此需要使用动态 SQL。

清单 2. 一个 SQL 例程中的动态 SQL 语句

				
 
 	 Create Function Count_Number_Of_Rows 
	      (ParTable  VarChar(128), 
	       ParSchema VarChar(128)) 
	       Returns Integer 
	       Language SQL 
	       Not Fenced 
	   Begin 
	      Declare RtnNbrRows Integer; 
	      Declare String     VarChar(256); 
	      
	      Set String = 'Values(Select Count(*) From '; 
	      
	      If ParSchema > ' ' Then 
	         Set String = String CONCAT ParSchema CONCAT '/'; 
	      End If; 
	      
	      Set String = String CONCAT ParTable CONCAT ') into ?'; 
	
	      PREPARE DynSQL From String; 
	      EXECUTE DynSQL Using RtnNbrRows; 
	      Return RtnNbrRows; 
	   End; 

动态 SQL 语句可用于 SQL 例程之中,也可嵌入程序,但最常用于通过 ODBC 或 DB2 Web Query 等接口运行 SQL 语句;以及通过 SQL 命令行处理程序来运行 SQL 语句,例如 IBM System i® Navigator Run Script Interface 或 RUNSQLSTM 和 RUNSQL 命令行命令。清单 3. 采用交互的方式发出的动态 SQL 语句 展示了一条通过 System i Navigator Run Script Interface 运行的动态 SQL 语句。

清单 3. 采用交互的方式发出的动态 SQL 语句

				
 
 	 Select * from Order_Header;

确定默认模式

如果一条 SQL 语句包含非限定表、视图或别名引用,那么 DB2 必须确定 默认模式,并搜索该模式。模式 是 SQL 中类似于 IBM i 库的术语。默认模式的初始值取决于 SQL 环境中使用的命名规范,以及运行的是 静态 SQL 语句,还是 动态 SQL 语句。

推荐阅读
  • 本文探讨了在 SQL Server 中使用 JDBC 插入数据时遇到的问题。通过详细分析代码和数据库配置,提供了解决方案并解释了潜在的原因。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 配置PHPStudy环境并使用DVWA进行Web安全测试
    本文详细介绍了如何在PHPStudy环境下配置DVWA( Damn Vulnerable Web Application ),并利用该平台进行SQL注入和XSS攻击的练习。通过此过程,读者可以熟悉常见的Web漏洞及其利用方法。 ... [详细]
  • 本文详细介绍如何使用 Apache Spark 执行基本任务,包括启动 Spark Shell、运行示例程序以及编写简单的 WordCount 程序。同时提供了参数配置的注意事项和优化建议。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
  • openGauss每日一练第 12 天 |学习openGauss定义数据类型
    自己安装的openGauss环境启动openGaussgsctlDgaussdatadb1start登录openGaussgsqldpostgresp26000r1.创建一 ... [详细]
  • 软件工程课堂测试2
    要做一个简单的保存网页界面,首先用jsp写出保存界面,本次界面比较简单,首先是三个提示语,后面是三个输入框,然 ... [详细]
  • 本文档介绍了如何在Visual Studio 2010环境下,利用C#语言连接SQL Server 2008数据库,并实现基本的数据操作,如增删改查等功能。通过构建一个面向对象的数据库工具类,简化了数据库操作流程。 ... [详细]
  • 数据排序、无限滚动与分页加载及子查询的使用
    本文介绍了数据排序的基本方法,包括升序和降序排列。同时探讨了瀑布流布局(无限滚动)和传统分页技术在Web应用中的应用,并详细解释了子查询的概念及其替代方案。 ... [详细]
  • 本文详细介绍了如何在Linux系统中创建和管理DB2数据库,包括用户切换、数据库创建、错误处理、连接与断开、表空间和缓冲池的创建,以及用户权限管理和数据导入导出等操作。 ... [详细]
  • 本文介绍了如何通过在数据库表中增加一个字段来记录文章的访问次数,并提供了一个示例方法用于更新该字段值。 ... [详细]
  • 在寻找轻量级Ruby Web框架的过程中,您可能会遇到Sinatra和Ramaze。两者都以简洁、轻便著称,但它们之间存在一些关键区别。本文将探讨这些差异,并提供详细的分析,帮助您做出最佳选择。 ... [详细]
  • 本文介绍了两款提高Android开发效率的插件:Lombok和SQLScout。Lombok可以帮助开发者自动处理实体类的Getter和Setter方法,使代码更加简洁;而SQLScout则提供了直观的SQLite数据库查看功能,极大地简化了数据库调试过程。 ... [详细]
  • 当unique验证运到图片上传时
    2019独角兽企业重金招聘Python工程师标准model:public$imageFile;publicfunctionrules(){return[[[na ... [详细]
  • MySQL Debug 模式的实现与应用
    本文详细介绍了如何启用和使用 MySQL 的调试模式,包括编译选项、环境变量配置以及调试信息的解析。通过实际案例展示了如何利用调试模式解决客户端无法连接服务器的问题。 ... [详细]
author-avatar
多米音乐_53913411
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有