【发布时间】:2012-04-06 05:21:15
【问题描述】:
在 Oracle 中有 PL/SQL,一种强大的命令式语言。 MySQL 有没有类似的东西?
【问题讨论】:
-
请具体说明。您在寻找什么功能?
-
我已经提供了一个答案来帮助解决这个问题——这是一个术语问题stackoverflow.com/a/52844734/124486
在 Oracle 中有 PL/SQL,一种强大的命令式语言。 MySQL 有没有类似的东西?
【问题讨论】:
虽然 MySQL 确实有类似的组件,但不,您不能在 MySQL 中使用 PL\SQL。 MS SQL Server 使用的 T-SQL 也是如此。
MySQL 有大量关于它的文档at their website.
您会看到 PL\SQL 和 T-SQL 都是图灵完备的,并且可能提供更多的功能。但是 MySQL 有很多方法可以执行类似的任务。
以下是 Yahoo Answers 帖子的内容:
MySQL 是一个多线程、多用户的 SQL 数据库管理系统 (DBMS)1,根据 MySQL AB 的数据,超过 1000 万 安装。
所有主要的数据库都提供用于访问 MySQL 数据库的库 具有特定语言 API 的编程语言。此外,一个 称为 MyODBC 的 ODBC 接口允许使用其他编程语言 支持 ODBC 接口与 MySQL 数据库通信, 例如 ASP 或 Coldfusion。 MySQL 服务器和官方库是 主要在 ANSI C 中实现。
MySQL 在 Web 应用程序中很受欢迎,并充当数据库 LAMP、MAMP 和 WAMP 平台的组件 (Linux/Mac/Windows-Apache-MySQL-PHP/Perl... 和开源错误 Bugzilla 等跟踪工具。它作为 Web 应用程序的受欢迎程度是 与 PHP 的流行密切相关,通常与 mysql。 PHP 和 MySQL 是运行流行的必备组件 WordPress 博客平台。
以下功能由 MySQL 实现,但不是由其他一些实现 关系型数据库:
- 多种存储引擎,允许您选择对应用程序中的每个表最有效的一个(在 MySQL 5.0 中, 必须编译存储引擎;在 MySQL 5.1 中,存储引擎可以 在运行时动态加载): o 原生存储引擎(MyISAM, Falcon, Merge, Memory (heap), Federated, Archive, CSV, Blackhole, 簇) -合作伙伴开发的存储引擎(InnoDB、solidDB、NitroEDB、BrightHouse) -社区开发的存储引擎
- 自定义存储引擎
- 提交分组,将来自多个连接的多个事务收集在一起以增加每秒提交的数量。
注意:: MySQL 是用 C 和 C++ 编写的。 SQL 解析器使用 yacc 和 自制的词法分析器。描述一些内部的文件 代码结构和编码指南可从 MySQL 网站。
SQL
SQL 通常扩展为结构化查询语言,是一种计算机 用于检索和管理数据的语言 关系数据库管理系统,数据库模式创建和 修改和数据库对象访问控制管理。
SQL 语言细分为几个语言元素, 包括:
- 可能对模式和数据产生持久影响的语句,或者可能控制事务、程序流、连接、 会话或诊断。
- 根据特定条件检索数据的查询。
- 可以生成标量值或由数据的列和行组成的表的表达式。
- 谓词指定可以评估为 SQL 三值逻辑 (3VL) 布尔真值的条件,通常用于 限制语句和查询的影响,或改变程序 流。
- 子句是(在某些情况下是可选的)语句和查询的组成部分
它在..查询数据操作数据定义的概念下工作 事务控制
SQL:2003 标准对 SQL:1999,并正式引入了一些新特性如:1
- XML 相关功能
- 窗口函数
- 序列生成器,允许标准化序列
- 两种新的列类型:自动生成的值和标识列
- 新的 MERGE 语句
- CREATE TABLE 语句的扩展,允许“CREATE TABLE AS”和“CREATE TABLE LIKE”
- 删除了执行不佳的“BIT”和“BIT VARYING”数据类型
PL/SQL
PL/SQL 是 Oracle Corporation 专有的基于服务器的过程扩展,可用于 SQL 数据库语言。 (其他一些 SQL 数据库管理系统 提供类似于 PL/SQL 的语言。)它的语法非常类似于 艾达的。
PL/SQL 支持变量、条件、数组和异常。 从 Oracle RDBMS 版本 8 开始的实现具有 包括与面向对象相关的功能。
底层 SQL 用作声明性语言。标准 SQL——不像一些函数式编程语言——不需要 将尾调用转换为跳转的实现。 SQL 不轻易 提供“第一行”和“表的其余部分”访问器,它不能 轻松执行一些构造,例如循环。然而,PL/SQL 作为 图灵完备的程序语言填补了这些空白,允许 Oracle 数据库开发人员与底层关系接口 以命令的方式建立数据库。 SQL 语句可以使显式 对 PL/SQL 函数的内联调用,或者可能导致 PL/SQL 触发器 触发预定义的数据操作语言 (DML) 事件。
PL/SQL 存储过程(函数、过程、包和 执行 DML 的触发器)被编译到 Oracle 数据库中: 在这个程度上,他们的 SQL 代码可以进行语法检查。程序员 在 Oracle 数据库环境中工作可以构造 PL/SQL 块 将此类功能用作程序、功能;或者他们可以 在 SQL*Plus 脚本中编写 PL/SQL 的内嵌段。
虽然程序员可以轻松地将 SQL DML 语句合并到 PL/SQL(例如,作为游标定义,或使用 SELECT ... INTO 语法),数据定义语言 (DDL) 语句,例如 CREATE TABLE/DROP INDEX 等需要使用“动态 SQL”。早些时候 Oracle 版本需要使用复杂的内置 DBMS_SQL 系统需要显式解析的动态 SQL 包 并执行一条 SQL 语句。以后的版本包括一个 EXECUTE IMMEDIATE 语法称为“Native Dynamic SQL”,这在很大程度上是 简化了事情。在 Oracle 中使用 DDL 将导致 隐式提交。程序员也可以使用 Dynamic SQL 来执行 DML 他们事先不知道声明的确切内容。
PL/SQL 提供了几个用于特定目的的预定义包。这样的 PL/SQL 包包括:
- DBMS_OUTPUT - 用于到非数据库目标的输出操作
- DBMS_JOB - 用于在特定时间运行特定过程/功能(即调度)
- DBMS_XPLAN - 用于格式化“解释计划”输出
- DBMS_SESSION - 提供对 SQL ALTER SESSION 和 SET ROLE 语句以及其他会话信息的访问。
- DBMS_METADATA - 用于从数据字典中提取元数据(例如 DDL 语句)
- UTL_FILE - 用于读取和写入磁盘上的文件
- UTL_HTTP - 用于从数据库向 Web 服务器发出请求
- UTL_SMTP - 用于从数据库发送邮件(通过 SMTP 服务器)
Oracle Corporation 通常会添加更多包和/或扩展 Oracle DBMS 的每个后续版本都具有打包功能。
【讨论】:
一些关系数据库供应商遵循 SQL 的传统定义,将其定义为declarative language。这些供应商的示例包括 PostgreSQL、IBM、Oracle。对于这些数据库供应商,您使用他们自己提供的过程语言编写过程代码,这些语言可能会也可能不会提供 SQL。
一些供应商虽然将他们的过程语言视为 SQL 的扩展。这些供应商没有任何这种差异化。例如,在 MySQL 中,"Stored Program" 声明为 LANGUAGE SQL,即使它提供不同的语言功能 (like LEAVE, REPEAT and UNTIL that are not provided elsewhere)。因此,“SQL 例程”中的“SQL 语言”本质上与查询表达式中的“SQL 语言”不同。像微软这样的其他供应商只用一个术语来称呼他们所做的一切——“T-SQL”。术语的删除使得很难在其他数据库中找到等效的特征,或者很难知道哪些特征可能不同。
完全标准化的程序功能可能会有所不同。虽然声明式查询语法很可能是相似的,因为它有一个规范。
【讨论】:
我不知道它们有多强大,但是这个网站提供了使用 SQL 编写 MySQL 存储过程的信息;
http://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx
例如
http://www.mysqltutorial.org/sql-cursor-in-stored-procedures.aspx
【讨论】:
没有。 pl/sql 是一种特定于 Oracle 的存储过程语言。不同的数据库对存储过程使用不同的语言。有关存储过程的信息,请参阅 mySql 文档的 page。
【讨论】:
谷歌搜索“Getting started with mysql stored procedures”,语法与 PLSQL 相差不远。
DELIMITER //
CREATE PROCEDURE GetAllProducts()
BEGIN
SELECT * FROM products;
END //
DELIMITER ;
【讨论】: