精华内容
下载资源
问答
  • SQL中的declare用法

    万次阅读 2018-04-11 17:35:20
    平时写SQL查询、存储过程都是凭着感觉来,没有探究过SQL的具体语法,一直都是按c#那一套往SQL上模仿,前几天项目中碰到一个问题引起了我对declare定义变量的作用域的兴趣。大家都知道c#中的局部变量,在if中如果...
    

    平时写SQL查询、存储过程都是凭着感觉来,没有探究过SQL的具体语法,一直都是按c#那一套往SQL上模仿,前几天项目中碰到一个问题引起了我对declare定义变量的作用域的兴趣。

    大家都知道c#中的局部变量,在if中如果我们定义一个变量的话他的作用到if结束为止,if外是不识别这个变量的,else里都不能使用,简单的写一下。

    if (true)
    {
          Int32 i = 1;
          Console.WriteLine(i);
    }

    这个i的作用域就是if里面,如果我们在if外面用这个变量

     

     

    if (true)
    {
        Int32 i = 1;
        Console.WriteLine(i);
    }
    Console.WriteLine(i);

     

    那第二条输出语句会报错

    The name 'i' does not exist in the current context

    说明已经出了i的作用域了。

    那么我们要是在sql写这么一段代码会是什么情况呢?首先写在if内 

    IF 1=1
    BEGIN
        DECLARE @test VARCHAR
        SET @test='1'   
        PRINT 'in if:'+@test
    END

      运行看结果输出in if:1这是可以预想的结果。那我们在if外面使用变量@test试试。

      

     

     

    复制代码
    IF 1=1
    BEGIN
       DECLARE @test VARCHAR
       SET @test='1'   
       PRINT 'in if:'+@test
    END
    PRINT 'out if:'+@test
    复制代码

     

    这样会是什么结果呢,不知道大家怎么想的,以我的大脑顺势就想到这应该报错啊,出了变量的作用域了。实际结果不仅没报错而且@test的值还在。

     in if:1

     out if:1

    看见这个结果当时我很郁闷,SQL太出人意料了。

    在SQL SERVER 2005的帮助文档里关于declare的帮助里发现这么一句话,备注的第三行“局部变量的作用域是其被声明时所在批处理”

    Msdn的地址:http://msdn.microsoft.com/zh-cn/library/ms188927.aspx

    这行字在这么一大篇中还真挺不引人瞩目。

    现在我们知道原来declare变量的作用域是所在的批处理,if阻断不了它的作用域,那上面我们的代码if内外的代码都在一个批处理中,所以@test都是可用的且if里面设置的值还在。

    下面我改造一下代码,SQL中是以GO语句来区分批处理的

     

    复制代码
    IF 1=1
    BEGIN
       DECLARE @test VARCHAR
       SET @test='1'   
       PRINT 'in if:'+@test
    END
    GO
    PRINT 'out if:'+@test
    复制代码

     

     

    这下对了,检查语法后SQL报错“必须声明标量变量"@test"”

     

    注:GO就是用于一个sql语句的结束 比如说一个批处理语句是这样的 select *from ,b select *from a 在后一个select后面加上一个GO这样可以一次执行两条sql 语句

    展开全文
  • SQL中declare用法

    2012-01-05 13:15:41
    strSQL.Append("declare @rodno varchar(50) "); strSQL.Append("set @rodno = @GetRod "); strSQL.Append("SELECT 'aaa' AS Type,a.rodNO as RodNO,a.starttime AS Starttime,b.endtime AS Endtime "); ...
  • 以下是MySQL数据库函数用法简析: 语法: 新建: Create function function_name(参数列表)returns返回值类型 函数体 函数名,应该合法的标识符,并且不应该与已有的关键字冲突。 一个函数应该

    MySQL数据库提供了很多函数包括:数学函数;字符串函数;日期和时间函数;条件判断函数;系统信息函数;加密函数;格式化函数;

    以下是MySQL数据库函数用法简析:

    语法:

    新建:

    Create function function_name(参数列表)returns返回值类型

    函数体

    函数名,应该合法的标识符,并且不应该与已有的关键字冲突。

    一个函数应该属于某个数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库,否则为当前数据库。

    参数部分,由参数名和参数类型组成。

    返回值类类型

    函数体由多条可用的mysql语句,流程控制,变量声明等语句构成。

    多条语句应该使用begin end语句块包含。

    注意,一定要有return返回值语句。

    删除:

    Dropfunction if existsfunction_name;

    查看:

    Show function status like ‘partten’

    Show create functionfunction_name;

    修改:

    Alter functionfunction_name函数选项。

    例子:

    Hello world!

    IF语句

    IF search_conditionTHEN

    statement_list

    [ELSEIF search_conditionTHENstatement_list]

    ...

    [ELSE statement_list]ENDIF;

    CASE语句

    CASE case_value

    WHEN when_valueTHENstatement_list

    [WHEN when_value THENstatement_list]

    ...

    [ELSE statement_list]

    END CASE; 

    循环:

    While

    [begin_label:]WHILEsearch_conditionDO

    statement_list

    END WHILE [end_label];

    如果需要在循环内提前终止 while循环,则需要使用标签;标签需要成对出现。

    退出循环

    退出整个循环leave 相当于break

    退出当前循环iterate 相当于 continue

    通过退出的标签决定退出哪个循环。

    变量声明:
    语法:
    DECLARE var_name[,...] type [DEFAULT value]
    这个语句被用来声明局部变量。要给变量提供一个默认值,请包含一个DEFAULT子句。值可以被指定为一个表达式,不需要为一个常数。如果没有DEFAULT子句,初始值为NULL。
    使用
    语序使用 set 和 select into语句为变量赋值。

    注意在函数内是可以使用全局变量(用户自定义的变量的)@XXX 全局变量不用声明 可以直接@XXX使用。

    例子:获取当前班级内,最大的学号。 

    参考学生表 

    create table join_student( 

    stu_id int not null auto_increment, 

    stu_no char(10), 

    class_id int not null, 

    stu_name varchar(10), 

    stu_info text, 

    primary key (stu_id) 

    ); 

    计算新增学号 

    drop function if existssno;

     delimiter $$ #在包含有语句块时 可以更换语句结束符“;” 为“$$” 

    create function sno(c_id int)returns char(10) 

    begin 

    declare last_no char(10); #声明一个局部变量 用来保存当前最大的学号, 如果没有就为null

    declare class_name char(10); 

    select stu_no from join_student where class_id=c_id order by stu_no desc limit 1 into last_no; 

    if last_no is null then #如果为空代表当前班级没有学生 从1开始,获得班级名字 

    return concat ((select c_name from join_class where id=c_id into class_name),'001'); #concat() 函数的作用是连接字符串。 

    else 

    return concat(left(last_no,7),lpad(right(last_no,3) + 1, 3, '0')); 

    end if;

     #return @last_no; 

    end 

    $$

    delimiter ; 

    随机获得学生名字。 

    drop function if exists sname; 

    delimiter $$ 

    create function sname() returns char(2) 

    begin 

    declare first_name char(16) default '赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨'; 

    declare last_name char(10) default '甲乙丙丁戊己庚辛壬癸'; 

    declare full_name char(2); 

    set full_name=concat(substring(first_name,floor(rand()*16+1), 1), substring(last_name,floor(rand()*10+1), 1)); 

    return full_name; 

    end 

    $$ 

    delimiter ;

    ========================================================================================

    mysql常用内置函数

    数值函数

    Abs(X),绝对值abs(-10.9) = 10

    Format(X,D),格式化千分位数值format(1234567.456, 2) =1,234,567.46

    Ceil(X),向上取整ceil(10.1) = 11

    Floor(X),向下取整floor (10.1) = 10

    Round(X),四舍五入去整

    Mod(M,N) M%N M MOD N 求余 10%3=1

    Pi(),获得圆周率

    Pow(M,N) M^N

    Sqrt(X),算术平方根

    Rand(),随机数

    TRUNCATE(X,D) 截取D位小数

    时间日期函数

    Now(),current_timestamp(); 当前日期时间

    Current_date();当前日期

    current_time();当前时间

    Date(‘yyyy-mm-dd HH;ii:ss’);获取日期部分

    Time(‘yyyy-mm-dd HH;ii:ss’);获取时间部分

    Date_format(‘yyyy-mm-dd HH;ii:ss’,’%D %y %a %d %m %b %j');

    Unix_timestamp();获得unix时间戳

    From_unixtime();//从时间戳获得时间

    字符串函数

    LENGTH(string ) //string长度,字节

    CHAR_LENGTH(string) //string的字符个数

    SUBSTRING(str ,position [,length ]) //从str的position开始,取length个字符

    REPLACE(str ,search_str ,replace_str) //在str中用replace_str替换search_str

    INSTR(string ,substring ) //返回substring首次在string中出现的位置

    CONCAT(string [,... ]) //连接字串

    CHARSET(str) //返回字串字符集

    LCASE(string ) //转换成小写

    LEFT(string ,length ) //从string2中的左边起取length个字符

    LOAD_FILE(file_name) //从文件读取内容

    LOCATE(substring , string [,start_position ]) //同INSTR,但可指定开始位置

    LPAD(string ,length ,pad ) //重复用pad加在string开头,直到字串长度为length

    LTRIM(string ) //去除前端空格

    REPEAT(string ,count ) //重复count次

    RPAD(string ,length ,pad) //在str后用pad补充,直到长度为length

    RTRIM(string ) //去除后端空格

    STRCMP(string1 ,string2 ) //逐字符比较两字串大小

    流程函数:

    CASE WHEN [condition]THEN result[WHEN [condition]THEN result ...][ELSE result]END 多分支

    IF(expr1,expr2,expr3) 双分支。

    聚合函数

    Count()

    Sum();

    Max();

    Min();

    Avg();

    Group_concat()

    其他常用函数

    Md5();

    Default();

    展开全文
  • DB2 数据库循环使用方法总结如下: 1. While循环使用方法: CREATE PROCEDURE ROCKY_WANG.P_WHILE(OUT V_I INTEGER) LANGUAGE SQL ...
    DB2 数据库循环使用方法总结如下:
     
    1. While循环使用方法:
     
    CREATE PROCEDURE ROCKY_WANG.P_WHILE
     (OUT V_I INTEGER
     )
      LANGUAGE SQL
      /*db2 数据库中循环语句while使用方法*/
      p1: begin
    declare i integer default 1;
    while i<10 do
    set i=i+1;
    end while;
    set v_i=i;
    end p1;
     
    2.Repeat循环使用方法:
     
    CREATE PROCEDURE ROCKY_WANG.P_REPEAT
     (OUT V_I INTEGER
     )
      LANGUAGE SQL
      /* db2数据库中循环语句repeat使用方法*/
    p1: begin
    declare i integer default 1;
    repeat_loop:
    repeat
    set i=i+1;
    until i>=10
    end repeat repeat_loop;
    set v_i=i;
    end p1;
     
     
    3.Loop循环使用方法:
     
    CREATE PROCEDURE ROCKY_WANG.P_LOOP
     (OUT V_I INTEGER
     )
      LANGUAGE SQL
      /* db2数据库中循环loop使用方法*/
    p1: begin
    declare i integer default 1;
    fetch_loop:
    loop
    if i<10 then
    set i=i+1;
    else
    leave fetch_loop;
    end if;
    end loop fetch_loop;
    set v_i=i;
    end p1;
     
     
    4.For 循环使用方法:

    CREATE PROCEDURE ROCKY_WANG.P_FOR_ACT
     (OUT V_STR VARCHAR(3000)
     )
      LANGUAGE SQL
      /*db2 数据库中循环for使用方法*/
    p1: begin
    set v_str='';
    for v_emp as select ACTKWD from ROCKY_WANG.ACT do
      set v_str=v_str||ltrim(rtrim(v_emp.actkwd))||';';
    end for;
    end p1;

    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14285854/viewspace-683155/,如需转载,请注明出处,否则将追究法律责任。

    转载于:http://blog.itpub.net/14285854/viewspace-683155/

    展开全文
  • declare命令用法

    2017-12-04 13:56:00
    只需要掌握declare -i 就可以了 本文转自 Super康 51CTO博客,原文链接:http://blog.51cto.com/zhengkangkang/1855822,如需转载请自行联系原作者 ...

    wKioL1fk0CbAeGCSAAIo6jSheCY052.png-wh_50

    只需要掌握declare -i 就可以了



    本文转自 Super康 51CTO博客,原文链接:http://blog.51cto.com/zhengkangkang/1855822,如需转载请自行联系原作者

    展开全文
  • MySQL declare语句用法介绍

    万次阅读 2014-08-18 17:13:49
    MySQL declare语句是在复合语句中声明变量的指令。 (1)Example with two DECLARE statements  两个DECLARE语句的实例 CREATE PROCEDURE p8 () BEGIN DECLARE a INT; DECLARE b INT; SET a = 5;...
  • 换工作了,以后主要和SqlServer打交道了,仿佛回到了大学,不知道学校的饭还是那么好吃又便宜吗?北京的饭好贵;不知道门口哪家板面的生意是不是还是那么红火,好想再...使用对象:类、接口、变量、方法 protect..
  • sql server 还原数据库时提示数据库正在使用,无法进行操作的解决方法解决办法方法一:设置数据库在单用户模式下工作。方法二:利用SQL语句,杀死正在使用数据库的所有进程方法三:利用SQL语句,断开所有用户链接,...
  • mysql中declare语句用法详解

    千次阅读 2012-03-09 16:18:29
    mysql中的DECLARE语句是在复合语句中声明变量的指令。 (1)Example with two DECLARE statements 两个DECLARE语句的实例 CREATE PROCEDURE p8 () BEGIN DECLARE a INT; DECLARE b INT; SET a = 5; SET b = 5;...
  • 本文实例讲述了mysql存储过程之游标(DECLARE)原理与用法。分享给大家供大家参考,具体如下: 我们在处理存储过程中的结果集时,可以使用游标,因为游标允许我们迭代查询返回的一组行,并相应地处理每行。mysql的...
  • 4) 掌握游标的定义、使用方法。 使用choose数据库,完成下列任务。 创建一个存储过程,计算a+b+c的值。 创建一个存储过程,根据准考证号查询学生的姓名和专业。 在choose数据库中创建存储过程get_...
  • --还原数据库数据库正在使用导致数据库无会还原,此存储过存在msater数据库下创建。exec killspid cztdba 结束此数据库的进程,这样才能还原数据库 create proc killspid (@dbname varchar(20)) ...
  • 转自 ... 1. For 循环使用方法:  CREATE PROCEDURE ROCKY_WANG.P_FOR_ACT  (OUT V_STR VARCHAR(3000)  )  LANGUAGE SQL    p1: begin  set v_str='';  for v_em
  • 原文:统计数据库大小的方法 一台服务器上所有数据库(也可能是部分数据库)的大小是我们经常需要了解的,它不仅能让我们知道目前数据库使用磁盘的比例, 而且定期搜集这些信息,还能了解数据库一段时间的数据增量...
  • USE MASTER  GO  ...SET @dbname = '修改此处数据库名' --这个是要删除的数据库库名    DECLARE @s NVARCHAR(1000)  DECLARE tb CURSOR LOCAL  FOR   SELECT s = 'kill 
  • 查询数据库重复记录方法

    千次阅读 2016-11-15 10:09:24
    SQL语句查询数据库重复记录的方法 SQL语句查询数据库重复记录的方法 SQL 语句 查询 数据库 记录SQL语句查询数据库重复记录的方法 假设现有一张人员表(表名:Person),若想将姓名、身份证号、住址这三个字段完全...
  • 方法一:更改数据库状态 USE Master ALTER DATABASE [XXX] SET OFFLINE -- sql do something ALTER DATABASE [XXX] SET OnLINE use XXX   方法二:杀掉数据库进程 declare @dbname varchar(20) set @...
  • 还原数据库备份的时候会出现一个这样的错误提示:因为数据库正在使用,所以无法获得对数据库的独占访问权 解决方法是:修改一些数据库名称,执行一下sql代码,然后马上还原即可 usemasterdeclare@dbnamevarchar...
  • PB内置OEACLE数据库接口的使用方法

    千次阅读 2006-09-28 11:14:00
    PB内置OEACLE数据库接口的使用方法 马长明 PowerBuilder(PB)和Oracle分别是前端开发工具和RDBMS的主流产品。PB提供了两种与Oracle连接的接口:PowerSoft内置的数据库接口(Native Database Interface)和ODBC接口。...
  • 还原数据库出现“因为数据库正在使用,所以无法获得对数据库的独占访问权”解决方法   今天在还有SQL 2005数据库时,出现"因为数据库正在使用,所以无法获得对数据库的独占访问权",因为有人在访问数据库,所以...
  • 今天在还原数据库时,服务器,出现"因为数据库正在使用,所以无法获得对数据库的独占访问权",因为有人在访问数据库",搜索了很久,终于的的到了解决办法,希望对朋友们有用. 1、首先定位到好要还原的数据库 2、运行...
  • mssql 数据库大小统计方法

    千次阅读 2013-04-25 15:52:34
    一台服务器上所有数据库(也可能是部分数据库)的大小是我们经常需要了解的,它不仅能让我们知道目前数据库使用磁盘的比例,而且定期搜集这些信息,还能了解数据库一段时间的数据增量,更为常用的是在做数据迁移和...
  • 数据库事务嵌套用法

    2012-11-05 15:43:00
    对于存储过程中调用其他存储过程时会使用很多事务,即每个存储过程中都存在事务!但是如果某一个存储过程出现回滚时,会报出“无法回滚Tran1,找不到该名称的事务或保存点。”解决此问题的方法是每个子存储过程中都...
  • Oracle中declare如何使用

    2021-05-14 14:04:01
    Oracle中declare使用方法 首先我们需要了解declare遵循下面的实现结构 declare --声明 begin --开始 end; --结束 了解之后,我们就可以在这个结构中添加语句实现小功能 例如:输出今天的日期 declare --声明 date...
  • USE MASTER GO DECLARE @dbname SYSNAME SET @dbname = 'databasename' --这个是要删除的数据库库名 DECLARE @s NVARCHAR(1000) DECLARE tb CURSOR LOCAL FOR SELECT s = 'kill ' + CAST(spid AS VARCHAR) FRO...
  • 从’abbccc’中返回’ccc’,charindex函数用法(charindex(查找的字符串,被查找的字符串,开始查找的位置),例如查找’abbccc’中第一个’c’出现的位置,charindex(‘c’,’abbccc’,1)) declare @str1 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 71,237
精华内容 28,494
关键字:

数据库declare的用法