精华内容
下载资源
问答
  • Create Proc 存储过程名称 (  @参数1 参数类型,  @参数2 参数类型,  ... ... --最后一行参数,末尾别加逗号,加逗号意思是表示后面还有参数 ) AS 需要执行SQL命令 GO ...
    Create Proc 存储过程名称
    
    (
    
      @参数1    参数类型,
    
      @参数2    参数类型,
    
      ...      ...  --最后一行参数,末尾别加逗号,加逗号的意思是表示后面还有参数
    AS
    
    需要执行的SQL命令
    
    GO

     

    例:

    向Example数据库中的department表(表中有ID,Name,Direc,Note这几个参数)插入数据的存储过程:

    USE Example
    
    GO
    
    Create Proc pro_department_insert  --创建名为pro_department_insert的存储过程
    
    (  --参数列表
    
      @ID    int,
    
      @Name  varchar(30),
    
      @Direc  varchar(10),
    
      @Note  varchar(10)  --这里没有逗号了
    AS
    
    Insert Into department VALUES (@ID,@Name,@Direc,@Note)
    
    GO

    转载于:https://www.cnblogs.com/lkc9/p/6512386.html

    展开全文
  • 今天创建存储过程时,一直提示在declare这句话报错,检查了2 3个小时也木有个头绪,在大神帮助下,知道了,原来是mysql ;(分号问题)。delimiter //解决问题以下文章主要是向大家描述是MySQL数据库中...

    今天创建存储过程时,一直提示在declare这句话报错,检查了2 3个小时也木有个头绪,在大神的帮助下,知道了,原来是mysql ;(分号的问题)。delimiter //解决问题

    以下的文章主要是向大家描述的是MySQL数据库中delimiter的作用是什么?我们一般都认为这个命令和存储过程关系不大,到底是不是这样的呢?以下的文章将会给你相关的知识,望你会有所收获。

    其实就是告诉MySQL解释器,该段命令是否已经结束了,MySQL数据库是否可以执行了。默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,MySQL将会执行该命令。如输入下面的语句

    MySQL>select * from test_table;

    然后回车,那么MySQL将立即执行该语句。

    但有时候,不希望MySQL这么做。在为可能输入较多的语句,且语句中包含有分号。如试图在命令行客户端中输入如下语句

    MySQL>CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT)

    MySQL>RETURNS varchar(255)

    MySQL>BEGIN

    MySQL>IF ISNULL(S) THEN

    MySQL>RETURN '';

    MySQL>ELSEIF N<15THEN

    MySQL>RETURN LEFT(S, N);

    MySQL>ELSE

    MySQL>IF CHAR_LENGTH(S)<=N THEN

    MySQL>RETURN S;

    MySQL>ELSE

    MySQL>RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5));

    MySQL>END IF;

    MySQL>END IF;

    MySQL>END;

    默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句。因为MySQL一遇到分号,它就要自动执行。即,在语句RETURN '';时,MySQL数据库解释器就要执行了。这种情况下,就需要事先把delimiter换成其它符号,如//或$$。

    MySQL>delimiter //

    MySQL>CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT)

    MySQL>RETURNS varchar(255)

    MySQL>BEGIN

    MySQL>IF ISNULL(S) THEN

    MySQL>RETURN '';

    MySQL>ELSEIF N<15THEN

    MySQL>RETURN LEFT(S, N);

    MySQL>ELSE

    MySQL>IF CHAR_LENGTH(S)<=N THEN

    MySQL>RETURN S;

    MySQL>ELSE

    MySQL>RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5));

    MySQL>END IF;

    MySQL>END IF;

    MySQL>END;//

    这样只有当//出现之后,MySQL解释器才会执行这段语句

    例子:

    MySQL>delimiter //

    MySQL>CREATE PROCEDURE simpleproc (OUT param1 INT)

    ->BEGIN

    ->SELECT COUNT(*) INTO param1 FROM t;

    ->END;

    ->//

    Query OK, 0 rows affected (0.00 sec)

    MySQL>delimiter ;

    MySQL>CALL simpleproc(@a);

    Query OK, 0 rows affected (0.00 sec)

    MySQL>SELECT @a;

    +------+

    | @a |

    +------+

    | 3 |

    +------+

    1 row in set (0.00 sec)

    本文代码在 MySQL 5.0.41-community-nt 下运行通过。

    编写了个统计网站访问情况(user agent)的 MySQL 数据库存储过程。就是下面的这段 SQL 代码。

    drop procedure if exists pr_stat_agent;

    -- call pr_stat_agent ('2008-07-17', '2008-07-18')

    create procedure pr_stat_agent

    (

    pi_date_from date

    ,pi_date_to date

    )

    begin

    -- check input

    if (pi_date_from is null) then

    setpi_date_from=current_date();

    end if;

    if (pi_date_to is null) then

    setpi_date_to=pi_date_from;

    end if;

    setpi_date_to=date_add(pi_date_from, interval 1 day);

    -- stat

    select agent, count(*) as cnt

    from apache_log

    where request_time>= pi_date_from

    and request_time

    group by agent

    order by cnt desc;

    end;

    我在 EMS SQL Manager 2005 for MySQL 这个 MySQL 图形客户端下可以顺利运行。但是在 SQLyog MySQL GUI v5.02 这个客户端就会出错。最后找到原因是没有设置好 delimiter 的问题。

    默认情况下,delimiter “;” 用于向 MySQL 提交查询语句。在存储过程中每个 SQL 语句的结尾都有个 “;”,如果这时候,每逢 “;” 就向 MySQL 提交的话,当然会出问题了。于是更改 MySQL 的 delimiter,上面 MySQL 存储过程就编程这样子了:

    delimiter //; -- 改变 MySQL delimiter 为:“//”

    drop procedure if exists pr_stat_agent //

    -- call pr_stat_agent ('2008-07-17', '2008-07-18')

    create procedure pr_stat_agent

    (

    pi_date_from date

    ,pi_date_to date

    )

    begin

    -- check input

    if (pi_date_from is null) then

    setpi_date_from=current_date();

    end if;

    if (pi_date_to is null) then

    setpi_date_to=pi_date_from;

    end if;

    setpi_date_to=date_add(pi_date_from, interval 1 day);

    -- stat

    select agent, count(*) as cnt

    from apache_log

    where request_time>= pi_date_from

    and request_time

    group by agent

    order by cnt desc;

    end; //

    delimiter ;

    改回默认的 MySQL delimiter:“;”

    当然,MySQL delimiter 符号是可以自由设定的,你可以用 “/” 或者“$$” 等。但是 MySQL数据库 存储过程中比较常见的用法是 “//” 和 “$$”。上面的这段在 SQLyog 中的代码搬到 MySQL 命令客户端(MySQL Command Line Client)却不能执行。

    MySQL> delimiter //; -- 改变 MySQL delimiter 为:“//”

    MySQL>

    MySQL>drop procedure if exists pr_stat_agent //

    ->

    ->-- call pr_stat_agent ('2008-07-17', '2008-07-18')

    ->

    ->create procedure pr_stat_agent

    ->(

    ->pi_date_from date

    ->,pi_date_to date

    ->)

    ->begin

    ->-- check input

    ->if (pi_date_from is null) then

    ->setpi_date_from=current_date();

    ->end if;

    ->

    ->if (pi_date_to is null) then

    ->setpi_date_to=pi_date_from;

    ->end if;

    ->

    ->setpi_date_to=date_add(pi_date_from, interval 1 day);

    ->

    ->-- stat

    ->select agent, count(*) as cnt

    ->from apache_log

    ->where request_time>= pi_date_from

    ->and request_time

    ->group by agent

    ->order by cnt desc;

    ->end; //

    ->

    ->delimiter ;

    改回默认的 MySQL delimiter:“;”

    ->//

    ->//

    ->//

    ->;

    ->;

    ->

    真是奇怪了!最后终于发现问题了,在 MySQL 命令行下运行 “delimiter //; ” 则 MySQL 的 delimiter 实际上是 “//;”,而不是我们所预想的 “//”。其实只要运行指令 “delimiter //” 就 OK 了。

    MySQL> delimiter // -- 末尾不要符号 “;”

    MySQL>

    MySQL>drop procedure if exists pr_stat_agent //

    Query OK, 0 rows affected (0.00 sec)

    MySQL>

    MySQL>-- call pr_stat_agent ('2008-07-17', '2008-07-18')

    MySQL>

    MySQL>create procedure pr_stat_agent

    ->(

    ->pi_date_from date

    ->,pi_date_to date

    ->)

    ->begin

    ->-- check input

    ->if (pi_date_from is null) then

    ->setpi_date_from=current_date();

    ->end if;

    ->

    ->if (pi_date_to is null) then

    ->setpi_date_to=pi_date_from;

    ->end if;

    ->

    ->setpi_date_to=date_add(pi_date_from, interval 1 day);

    ->

    ->-- stat

    ->select agent, count(*) as cnt

    ->from apache_log

    ->where request_time>= pi_date_from

    ->and request_time

    ->group by agent

    ->order by cnt desc;

    ->end; //

    Query OK, 0 rows affected (0.00 sec)

    MySQL>

    MySQL>delimiter ;

    末尾不要符号 “//”

    MySQL>

    顺带一提的是,我们可以在 MySQL 数据库中执行在文件中的 SQL 代码。例如,我把上面存储过程的代码放在文件 d:\pr_stat_agent.sql 中。可以运行下面的代码建立存储过程。

    MySQL>source d:\pr_stat_agent.sql

    Query OK, 0 rows affected (0.00 sec)

    Query OK, 0 rows affected (0.00 sec)

    source 指令的缩写形式是:“\.”

    MySQL>\. d:\pr_stat_agent.sql

    Query OK, 0 rows affected (0.00 sec)

    Query OK, 0 rows affected (0.00 sec)

    最后,可见 MySQL数据库的客户端工具在有些地方是各自为政,各有各的一套。

    展开全文
  • 创建存储过程

    2008-05-13 16:27:00
    创建存储过程:在MS SQL Server 2000 中,创建一个存储过程有两种方法:一种是使用Transaction-SQL 命令Create Procedure, 另一种是使用图形化管理工具Enterprise Manager。 用Transaction- SQL 创建存储过程是一种...
    创建存储过程:
    

    在MS SQL Server 2000 中,创建一个存储过程有两种方法:一种是使用Transaction-SQL 命令Create Procedure, 另一种是使用图形化管理工具Enterprise Manager。 用Transaction- SQL 创建存储过程是一种较为快速的方法,但对于初学者,使用Enterprise Manager 更易理解,更为简单。
    当创建存储过程时,需要确定存储过程的三个组成部分;

    • 所有的输入参数以及传给调用者的输出参数。
    • 被执行的针对数据库的操作语句,包括调用其它存储过程的语句;
    • 返回给调用者的状态值,以指明调用是成功还是失败。

    12.2.1 使用Enterprise Manager 创建存储过程
    按照下述步骤用Enterprise Manager 创建一个存储过程:

    • 启动Enterprise Manager, 登录到要使用的服务器。
    • 选择要创建存储过程的数据库,在左窗格中单击Stored Procedure 文件夹,此时在右窗格中显示该数据库的所有存储过程,如图12-1 所示。
    • 右击Stored Procedure 文件夹,在弹出菜单中选择New Stored Procedure, 此时打开创建存储过程对话框,如图12-2 所示。
    • 输入存储过程正文。
    • 单击Check Syntax, 检查语法是否正确。
    • 单击OK, 保存。
    • 在右窗格中,右击该存储过程,在弹出菜单中选择All task, 选择ManagePermissions, 设置权限,如图12-3 所示。

    12.2.2 用CREATE PROCEDURE 命令创建存储过程
    通过运用Create Procedure 命令能够创建存储过程,在创建存储过程之前,应该考虑到以下几个方面:

    • 在一个批处理中,Create Procedure 语句不能与其它SQL 语句合并在一起;
    • 数据库所有者具有默认的创建存储过程的权限,它可把该权限传递给其它的用户
    • 存储过程作为数据库对象其命名必须符合命名规则;
    • 只能在当前数据库中创建属于当前数据库的存储过程。

    用Create Procedure 创建存储过程的语法规则如下:
    CREATE PROC [ EDURE ] procedure_name [ ; number ]
    [ { @parameter data_type }
    [ VARYING ] [ = default ] [ OUTPUT ]
    ] [ ,...n ]
    [ WITH
    { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
    [ FOR REPLICATION ]
    AS sql_statement [ ...n ]

    各参数的含义如下:

    • procedure_name
      是要创建的存储过程的名字,它后面跟一个可选项number, 它是一个整数,用来区别一组同名的存储过程。存储过程的命名必须符合命名规则,在一个数据库中或对其所有者而言,存储过程的名字必须惟一。
    • @parameter
      是存储过程的参数。在Create Procedure 语句中,可以声明一个或多个参数。当调用该存储过程时,用户必须给出所有的参数值,除非定义了参数的缺省值。若参数的形式以 @parameter=value 出现,则参数的次序可以不同,否则用户给出的参数值必须与参数列表中参数的顺序保持一致。若某一参数以@parameter=value 形式给出,那么其它参数也必须以该形式给出。一个存储过程至多有1024 个参数。
    • Data_type
      是参数的数据类型。在存储过程中,所有的数据类型包括text 和image 都可被用作参数。但是,游标cursor 数据类型只能被用作OUTPUT 参数。当定义游标数据类型时,也必须对VARING 和OUTPUT 关键字进行定义。对可能是游标型数据类型的OUTPUT 参数而言,参数的最大数目没有限制。
    • VARYING
      指定由OUTPUT 参数支持的结果集,仅应用于游标型参数。
    • Default
      是指参数的缺省值。如果定义了缺省值,那么即使不给出参数值,则该存储过程仍能被调用。缺省值必须是常数,或者是空值。
    • OUTPUT
      表明该参数是一个返回参数。用OUTPUT 参数可以向调用者返回信息。Text 类型参数不能用作OUTPUT 参数。
    • RECOMPILE
      指明SQL Server 并不保存该存储过程的执行计划,该存储过程每执行一次都又要重新编译。
    • ENCRYPTION
      表明SQL Server 加密了syscomments 表,该表的text 字段是包含有Create procedure语句的存储过程文本,使用该关键字无法通过查看syscomments 表来查看存储过程内容。
    • 创建存储过程:
    • FOR REPLICATION
      选项指明了为复制创建的存储过程不能在订购服务器上执行,只有在创建过滤存储过程时(仅当进行数据复制时过滤存储过程才被执行),才使用该选项。FOR REPLICATION与WITH RECOMPILE 选项是互不兼容的。
    • AS
      指明该存储过程将要执行的动作。
    • Sql_statement
      是任何数量和类型的包含在存储过程中的SQL 语句。

    另外应该指出,一个存储过程的最大尺寸为128M, 用户定义的存储过程必须创建在当前数据库中。
     下面将给出几个例子,用来详细介绍如何创建包含有各种保留字的存储过程。




        

    展开全文
  • 下面用一个案列演示存储过程的创建及使用 有两张表,一张商品分类表,一张商品详情表 使用无参存储过程查询火锅类商品信息 if object_id('proc_select') is not null drop proc proc_select go create proc proc_...

    存储过程是一个预编译的SQL语句,只需要创建一次,就可以多次调用,使用存储过程比单纯SQL语句执行要快。
    存储过程又分为有参数存储过程和无参数存储过程,调用存储过程使用exec 存储过程名 “参数” 命令来调用存储过程
    下面用一个案列演示存储过程的创建及使用
    有两张表,一张商品分类表,一张商品详情表在这里插入图片描述
    在这里插入图片描述
    使用无参存储过程查询火锅类商品信息

    if object_id('proc_select') is not null
    	drop proc proc_select
    go
    create proc proc_select
    as
    select p.title 商品名,c.categoryName 商品分类,p.currentPrice 商品团购价,p.productDesc 介绍 from category c,business.product p 
    where c.categoryID=p.categoryID and c.categoryName='火锅'
    
    exec proc_select
    

    以上代码 if object_id(‘proc_select’) is not null 判断该存储过程是否存在,存在的话drop掉,不存在则创建proc_select存储过程。
    通过以上案列,我们学会了使用无参存储过程。但是查询结果单一,就有了有参存储过程语法如下:

    if object_id('proc_select') is not null
    	drop proc proc_select
    go
    create proc proc_select(@name varchar(20))
    as
    select p.title 商品名,c.categoryName 商品分类,p.currentPrice 商品团购价,p.productDesc 介绍 from category c,business.product p 
    where c.categoryID=p.categoryID and c.categoryName=@name
    
    exec proc_select @name='KTV'
    

    这样我们就可以给根据name的赋值,查出你想要的结果。你学到了嘛!!!

    展开全文
  • mysql 创建存储过程

    2012-12-17 16:05:02
    创建存储过程 mysql&gt; delimiter $  -- delimiter $是设置 $为命令终止符号,代替默认分号,因为分号有其他用处.
  • 被内容来自《oracle从入门到精通——明日科技》一书  存储过程是一种命名的PL/SQL程序快,存储过程...创建存储过程的语法  1.2.下面通过一个实际例子来解释如何创建一个存储过程。  1.3.执行存储过程 2.存储过程
  • 以后需要数据库提供与已定义好的存储过程的功 能相同的服务时,只需用 CALL 语句来调用存储过程名字,即可自动完成命令。优点运行效率高。存储过程在创建时已经对其进行了语法分析及优化工作,...
  • 使用Microsoft SQL Server 2005创建应用程序时,Transact-SQL编程语言是应用程序和Microsoft SQL Server数据库之间主要编程接口。...(2)也可以将程序作为存储过程存储在SQL Server中,创建执行...
  • 以后需要数据库提供与已定义好的存储过程的功 能相同的服务时,只需用 CALL 语句来调用存储过程名字,即可自动完成命令。优点运行效率高。存储过程在创建时已经对其进行了语法分析及优化工作,...
  • 1.创建存储过程 1.1无参(call是调用) 1.2.1有参输入in 1.2.2有参输出out 注意:用dos窗口时候END $后面加上\才是真正结束 2.修改乱码 2.1打开DOS窗口,输入命令打开MySQL 2.2进入MySQL窗口...
  • 1、总所周知,mysql的命令行执行每一条命令是以分号结尾的,也就是说识别是否为一条命令,...2、解决方法是需要加一个分隔符,让命令行知道整个存储过程的代码是完整的一块代码,代码如下 DELIMITER // CREATE
  • MySQL在创建存储过程的时候,如创建存储过程,如果使用的是Navicat、DataGrip 等程序创建,代码是下面这样的:CREATE PROCEDURE xxxx()BEGINselectavg(prod_price) as priceaveragefromproducts;END;但是,有一个...
  • 基于Oracle数据库存储过程的创建及调用1.PLSQL编程1.1 概念和目的什么是PL/SQL?PL/SQL(Procedure Language/SQL)PLSQL是oracle对sql语言的过程化扩展(类似于Basic)指在SQL命令语言中增加了过程处理语句(如分支、循环...
  • 存储过程:概念、无参存储、有参存储(输入、输出).JAVA调用存储存储过程.1. PLSQL编程1.1. 概念和目的什么是PL/SQL?PL/SQL(Procedure Language/SQL)PLSQL是Oracle对sql语言过程化扩展 (类似于Basic)指在SQL命令...
  • 切记创建函数或过程的时候不要用phpmyadmin,不然有可能出错!一、查看创建函数的功能是否开启:二、如果Value处值为OFF,则需将其开启。mysql> set global log_bin_trust_function_creators=1;三、创建函数时,...
  • 1、PLSQL编程1.1概念和目的PL/SQL(Procedure Language/SQL)PLSQL是Oracle对sql语言的过程化扩展指在SQL命令语言中增加了过程处理语句(如分支、循环),使SQL语言具有过程处理能力1.2程序结构通过PLsqlDeveloper工具...
  • 存储过程是一个预编译SQL语句,优点是允许模块化设计,就是说只需创建一次,以后在程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个“execute 存储过程名 ...
  • sql语法很多,是一门完整语言。...创建一个存储过程注意,创建存储过程的时候,如果采用命令行的方式,需要先修改命令结束符,将分号改成其他的符号3.创建一个事件,并调用存储过程3.1开启定时器到这里...
  • 使用VARRAY简单数组示例.DECLARETYPE Str_Array IS VARRAY(4) OF VARCHAR2(50);v_array Str_Array;PROCEDURE PROCESS_ARRAY(v_str_array Str_Array)ASBEGINFOR i IN v_str_array.first .. v...
  • 写好命令,复制一整片代码运行,发现好多提示:Display all 475 possibilities? (y or n) 导致复制失败,一查原因,原来是复制代码中包含了Tab缩进,只要将原来复制代码中Tab空格全部去掉即可,完美解决...
  • Kid编程数据库教程系列文章顾名思义,数据库是指数据存储的仓库,数据库使用者可以通过数据库对象实现数据存储、管理与维护。因此数据库的创建操作是数据库使用第一步与基础。在MySQL数据库管理系统中,数据库...
  • 在MS SQL Server 2000 中,创建一个存储过程有两种方法:一种是... 用Transaction- SQL 创建存储过程是一种较为快速方法,但对于初学者,使用Enterprise Manager 更易理解,更为简单。  当创建存储过程时,需要...
  • 1.概念 存储过程和函数是: 事先经过编译并存储在数据库中一段SQL语句集合 ...4.创建存储过程 -- *创建空参存储过程 DELIMITER 分割符 CREATE PROCEDURE 存储过程名称() BEGIN sql语句; -
  • 今天创建存储过程时,一直提示在declare这句话报错,检查了2 3个小时也木有个头绪,在大神帮助下,知道了,原来是mysql ;(分号问题)。delimiter //解决问题以下文章主要是向大家描述是MySQL数据库中...
  • 在MS SQL Server 2000 中,创建一个存储过程有两种方法:一... 用Transaction- SQL 创建存储过程是一种较为快速方法,但对于初学者,使用Enterprise Manager 更易理解,更为简单。当创建存储过程时,需要确定存储过程
  • aws-elastic-beanstalk-cli:EB CLI是Elastic Beanstalk命令行界面,提供交互命令,简化了从本地存储创建,更新和监视环境的过程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,495
精华内容 598
关键字:

创建存储过程的命令是