【问题标题】:PL/MySQL does it exist?PL/MySQL 是否存在?
【发布时间】:2012-04-06 05:21:15
【问题描述】:

在 Oracle 中有 PL/SQL,一种强大的命令式语言。 MySQL 有没有类似的东西?

【问题讨论】:

标签: mysql scripting plsql


【解决方案1】:

虽然 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 的每个后续版本都具有打包功能。

【讨论】:

    【解决方案2】:

    术语问题

    一些关系数据库供应商遵循 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”。术语的删除使得很难在其他数据库中找到等效的特征,或者很难知道哪些特征可能不同。

    完全标准化的程序功能可能会有所不同。虽然声明式查询语法很可能是相似的,因为它有一个规范。

    【讨论】:

      【解决方案3】:

      我不知道它们有多强大,但是这个网站提供了使用 SQL 编写 MySQL 存储过程的信息;

      http://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx

      例如

      http://www.mysqltutorial.org/sql-cursor-in-stored-procedures.aspx

      【讨论】:

        【解决方案4】:

        没有。 pl/sql 是一种特定于 Oracle 的存储过程语言。不同的数据库对存储过程使用不同的语言。有关存储过程的信息,请参阅 mySql 文档的 page

        【讨论】:

        • 我看到你像我一样用谷歌搜索“pl/sql for mysql”并找到了第一个结果。也许 OP 应该下次尝试一下 :-)
        • 请检查我给出的链接是否与谷歌结果相同。
        • 哎呀,我还没有检查链接。很高兴你能修复它。
        【解决方案5】:

        谷歌搜索“Getting started with mysql stored procedures”,语法与 PLSQL 相差不远。

            DELIMITER //     
            CREATE PROCEDURE GetAllProducts()
               BEGIN
               SELECT *  FROM products;
            END //
            DELIMITER ;
        

        【讨论】:

          猜你喜欢
          • 2011-07-20
          • 2012-08-07
          • 1970-01-01
          • 2013-09-15
          • 2016-12-05
          • 1970-01-01
          • 1970-01-01
          • 2011-03-28
          • 1970-01-01
          相关资源
          最近更新 更多