精华内容
下载资源
问答
  • expression式中调用一个函数,并直接向expression式中使用的调用方返回一个值。您不能用CALL语句调用函数,也不能expression式中调用过程。例程创build语法程序和函数上有所不同:过程参数可以定义为仅...

    程序和函数之间最常见的区别在于它们被调用的方式不同,目的不同:

    一个过程不会返回一个值。 而是使用CALL语句调用它来执行操作,例如修改表或处理检索到的logging。

    在expression式中调用一个函数,并直接向expression式中使用的调用方返回一个值。

    您不能用CALL语句调用函数,也不能在expression式中调用过程。

    例程创build的语法在程序和函数上有所不同:

    过程参数可以定义为仅input,仅输出或两者。 这意味着一个过程可以通过使用输出参数将值传递给调用者。 这些值可以在CALL语句后面的语句中访问。 函数只有input参数。 因此,虽然程序和函数都可以有参数,但程序参数声明与函数不同。

    函数返回值,所以在函数定义中必须有一个RETURNS子句来表示返回值的数据types。 此外,函数体内必须至less有一个RETURN语句才能将值返回给调用者。 过程定义中不显示RETURNS和RETURN。

    要调用存储过程,请使用CALL statement 。 要调用存储的函数,请在expression式中引用它。 该函数在expression式评估期间返回一个值。

    使用CALL语句调用过程,并且只能使用输出variables传回值。 一个函数可以像在其他函数中那样从一个语句中调用(也就是通过调用该函数的名字),并且可以返回一个标量值。

    将参数指定为IN,OUT或INOUT仅对于PROCEDURE有效。 对于function,参数始终被视为IN参数。

    如果在参数名称前没有给出关键字,则默认为IN参数。 存储函数的参数不在IN,OUT或INOUT之前。 所有的function参数都被视为IN参数。

    要定义存储过程或函数,分别使用CREATE PROCEDURE或CREATE FUNCTION:

    CREATE PROCEDURE proc_name ([parameters]) [characteristics] routine_body CREATE FUNCTION func_name ([parameters]) RETURNS data_type // diffrent [characteristics] routine_body

    存储过程(不是函数)的MySQL扩展是一个过程可以生成一个结果集,或者甚至是多个结果集,调用者的处理方式与SELECT语句的结果相同。 但是,这样的结果集的内容不能直接在expression式中使用。

    存储例程 (指存储过程和存储函数) 与特定数据库相关联,就像表或视图一样。 删除数据库时,数据库中的任何存储例程也将被删除。

    存储过程和函数不共享相同的名称空间。 在数据库中可能有一个相同名称的过程和函数。

    在存储过程中,可以使用dynamicSQL,但不能在函数或触发器中使用。

    SQL准备语句(PREPARE,EXECUTE,DEALLOCATE PREPARE)可用于存储过程,但不能存储函数或触发器。 因此,存储的函数和触发器不能使用dynamicSQL(您将语句构造为string,然后执行它们)。 (MySQL存储例程中的dynamicSQL)

    FUNCTION和STORED PROCEDURE之间的一些更有趣的区别:

    ( 这一点是从博客复制 。 )存储过程是预编译的执行计划,其中function不是。 函数在运行时parsing和编译。 存储过程,存储为数据库中的伪代码即编译forms。

    ( 我不确定这一点。 )

    存储过程具有安全性,减less了networkingstream量,同时我们还可以调用存储过程。 一次申请。 参考

    函数通常用于计算,而程序通常用于执行业务逻辑。

    函数不能影响数据库的状态(在函数中不允许显式或隐式提交或回滚的语句)存储过程可以使用提交等影响数据库的状态

    参考: J.1。 存储例程和触发器的限制

    函数不能使用FLUSH语句,而存储过程可以。

    存储函数不能recursion而存储过程可以。 注意:recursion存储过程默认是禁用的,但可以通过将max_sp_recursion_depth服务器系统variables设置为非零值来在服务器上启用。 有关更多信息,请参见第5.2.3节“系统variables” 。

    在已存储的函数或触发器中,不允许通过调用函数或触发器的语句来修改已经在使用(用于读取或写入)的表。 良好的例子: 如何更新MYSQL删除相同的表?

    注意 :虽然一些限制通常适用于已存储的函数和触发器,但不适用于存储过程,但如果存储过程是从存储的函数或触发器中调用的,则这些限制适用于存储过程。 例如,尽pipe可以在存储过程中使用FLUSH,但是这样的存储过程不能从存储的函数或触发器中调用。

    展开全文
  • /*output用法:简单一点说就是带有output标识参数在存储过程中的修改将被保存。 如果不带,那么当存储过程运行结束后,对参数修改将消失。如果用编程语言来形容话, 就是类似于值传递参数与地址传递参数...

    存储过程里output的使用总结。

    /*output的用法:简单一点说就是带有output标识的参数在存储过程中的修改将被保存。

    如果不带,那么当存储过程运行结束后,对参数的修改将消失。如果用编程语言来形容的话,

    就是类似于值传递参数与地址传递参数一样的方式。这里要注意的是如果要设置output,形参和实参要同时设置(实参可以不写),否则会报以下错误

    形参"@***" 未声明为OUTPUT 参数,但传递进来的实参请求输出。*/

    CREATE PROC STU_SNO(@SNO VARCHAR(10) output)--在写这个参数的时候必须要加括号,否则会报错:超出了存储过程、函数、触发器或视图的最大嵌套层数

    AS

    SELECT *

    FROM STUDENT

    WHERE SNO=@SNO

    declare @num varchar(10)

    set @num='990001'

    EXEC STU_SNO @num output--这个output可以不写

    select @num--这里只能用select而不能用print,否则是打不出东西的


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

    展开全文
  • 在使用的过程中需要通过对地址解引用来操作其所指向变量,同时可以通过指针自增自减移动从而改变所指向值,灵活度较大。 (2)引用作为函数参数进行传递时,实质上传递是实参本身,即传递进来不是实参...

    (1)用指针传递参数,可以实现对实参进行改变的目的,是因为传递过来的是实参的地址,因此使用*a实际上是取存储实参的内存单元里的数据,即是对实参进行改变,因此可以达到目的。在使用的过程中需要通过对地址的解引用来操作其所指向的变量,同时可以通过指针的自增自减移动从而改变所指向的值,灵活度较大。

    (2)引用作为函数参数进行传递时,实质上传递的是实参本身,即传递进来的不是实参的一个拷贝,因此对形参的修改其实是对实参的修改.因而函数返回后作出的修改会依旧存在,引用传递可以节省复制所需要的时间和空间。

     

    (3)对于二重指针的使用情况:对于链表和树或char*字符串时,这些本身就是指针类型,当需要通过形参带回变化后的结果时,又要使用指针作参数,所以使用二重指针作为形参。如果函数传参采用一级指针时,解引用时只能改变该指针指向的头或根结点,而不能影响整个链表或树这个结构。

    定义链表结构时,LinkList(也就是LNode *)H代表的是整个链表,函数传址调用时,实参传递的是地址值。当采用二级指针形参LinkList *L(也就是LNode **)时,要传递链表的起始地址&H给形参L,而采用一级指针形参LNode *L时,传递的是头结点的地址&(*H)(也就是头指针H)。

    针对以上情况也可以使用指针的引用来代替二重指针,以下是分别用二重指针和指针引用作为形参的示例程序:

    #include<iostream>
    using namespace std;
    
    
    void test(int **p)      //以指针类型变量的地址作为形参
    {
        int a=1;
        *p=&a;                 //*p作为一个指针变量存放的是变量a的地址
        cout<<*p<<" "<<**p<<endl;
    }
    
    
    int main(void)
    {
        int *p=NULL;                    //定义指针类型的变量p
        test(&p);                       //通过指针地址作为形参传递改变了指针p的内容
        if(p==NULL)           
        cout<<"指针p为NULL"<<endl;
        system("pause");
        return 0;
    } 

    下面是利用形参为指针的引用的函数:

    #include<iostream>
    using namespace std;
    void test(int *&p)
    {
        int a=1;
        p=&a;
        cout<<p<<" "<<*p<<endl;
    }
    
    
    int main(void)
    {
        int *p=NULL;
        test(p);               
        if(p==NULL)             
        cout<<"指针p为NULL"<<endl;
        else
        cout<<p<<" "<<*p<<endl;
        system("pause");
        return 0;
    }
    

      

    可以看出利用指针的引用相较二重指针达到了相同的功能,但比使用二重指针要简单明了(与一重指针相似)

     

     

    来源

     

    转载于:https://www.cnblogs.com/skullboyer/p/9050636.html

    展开全文
  • SQL Server 的存储过程中,支持输入(Input)、输出参数(Output),也支持返回值参数(ReturnValue)关于输入参数,大家都很好理解,就是我们提供数值给存储过程,这就好比是编程的按值传递(ByVal)的形参。...

    在SQL Server 的存储过程中,支持输入(Input)、输出参数(Output),也支持返回值参数(ReturnValue)

    关于输入参数,大家都很好理解,就是我们提供数值给存储过程,这就好比是编程中的按值传递(ByVal)的形参。该参数传递到存储过程后,经过处理,但调用方是不可以得到经过处理之后的值的。

    而输出参数,则类似于编程中的按引用传递(ByRef)的形参。也就是说,该参数传递到存储过程之后,可以在调用方得到处理过后的值。

    返回值参数不是一个形参,而类似于编程中的返回值类型。它都是通过Return语句来返回的,而且在SQL Server中,必须返回INT型的数据,而且很显然,只能有一个返回值,因为RETURN语句其实是会终止存储过程的。

    下面来看看一个例子

    ALTER PROCEDURE [dbo].[GetCustomers]

    (@rowcount INT OUTPUT)

    AS

    SELECT [CustomerID]

    ,[CompanyName]

    ,[ContactName]

    ,[ContactTitle]

    ,[Address]

    ,[City]

    ,[Region]

    ,[PostalCode]

    ,[Country]

    ,[Phone]

    ,[Fax]

    FROM [Northwind].[dbo].[Customers]

    SET @rowcount=@@rowcount

    上面这个存储过程是通过一个输出参数,来接收一个行计数。

    要实现同样的功能,也可以用返回值参数

    ALTER PROCEDURE [dbo].[GetCustomers]

    AS

    SELECT [CustomerID]

    ,[CompanyName]

    ,[ContactName]

    ,[ContactTitle]

    ,[Address]

    ,[City]

    ,[Region]

    ,[PostalCode]

    ,[Country]

    ,[Phone]

    ,[Fax]

    FROM [Northwind].[dbo].[Customers]

    RETURN @@rowcount

    那么,如何在别的存储过程中调用该存储过程,并且接收它的输出参数或者返回值参数呢

    下面是接收输出参数的示例

    DECLARE @count INT

    EXECUTE GetCustomers  @count OUTPUT

    PRINT @count

    下面是接收返回值参数的示例

    DECLARE @count INT

    EXECUTE @count=GetCustomers

    PRINT @count

    展开全文
  • 在使用的过程中需要通过对地址解引用来操作其所指向变量,同时可以通过指针自增自减移动从而改变所指向值,灵活度较大。 (2)引用作为函数参数进行传递时,实质上传递是实参本身,即传递进来不是...
  • 自身对存储过程概念的理解: -- 存储过程 不同点: -- 标识符不同:函数是FUNCTION 存储过程是PROCEDURE -- 函数有返回值,且必须有返回,存储过程是没有返回值的 ...存储过程的形参类型: IN ...
  • 这里不动参数可以举个例子,例如某种数据容器指针(stack等)这个指针只向容器递归的过程中没有发生任何变化却随着递归执行一次又一次发生复制,这就是对空间极大浪费。 解决方法无外乎两种,第...
  • 在使用语句时候,不可避免要考虑参数问题,而参数又是用来辅助变量。有些小伙伴看到我们标题中的入参形参不知道是什么意思,其实也不难理解。我们把出参和入参看成输入和输出意思就可以了。想必这样说大家...
  • MySQL--存储过程

    2018-07-11 01:55:22
    工作中用到存储过程使用场景,动态创建表,需要用到存储过程。 1 Navicat创建存储过程。 填写的imageid类似于方法的形参存储过程代码 BEGIN #Routine body goes here...procedure SELECT * FROM...
  • 存储过程实现集

    2007-08-06 14:27:00
    在存储过程中使用形参(OUTPUT类型参数)4.将制定表列名转化为字符串(COL1,COL2,COL3)5.变横向表为纵向表1.一个简单存储过程(可动态实现表名检索)ALTER PROCEDUR DoSelect( @tbname varchar(20))AS declare @...
  • C语言:11、实参/形参

    2020-11-18 11:21:08
    实际参数简称“实参”。调用有参函数时,函数名后面括号的参数称为“实际参数”,实参可以是常量、...1、函数的形参列于函数声明函数定义的函数体内使用未出现函数调用时,形参不占内存存储单元;
  • 最近上数据结构课程,学习了线性表基本实现方法和操作,但是实现过程中,遭遇了有函数在形参里面使用的是线性表指针Sqlist*L,有则是使用的是线性表指针引用Sqlist*& L,对此,我进行了一点自己...
  • C变量的存储方式-“静态存储...动态存储变量是程序执行过程中使用它时才分配存储单元,使用完毕立即释放。典型例子是函数形式参数,函数定义时并不给形参分配存储单元,只是函数被调用时,才予以分配,调用
  • 动态存储和静态存储区域区别

    千次阅读 多人点赞 2017-11-27 19:19:23
    动态存储变量是程序执行过程中使用它时才分配存储单元, 使用完毕立即释放。 典型例子是函数形式参数,函数定义时并不给形参分配存储单元,只是函数被调用时,才予以分配, 调用函数完毕立即释放。...
  • C静态存储动态存储

    2013-01-17 21:05:00
    动态存储变量是程序执行过程中使用它时才分配存储单元, 使用完毕立即释放。 典型例子是函数形式参数,函数定义时并不给形参分配存储单元,只是函数被调用时,才予以分配, 调用函数完毕立即释放。如果...
  • 静态存储与动态存储

    2015-05-25 17:26:00
    动态存储变量是程序执行过程中使用它时才分配存储单元, 使用完毕立即释放。 典型例子是函数形式参数,函数定义时并不给形参分配存储单元,只是函数被调用时,才予以分配, 调用函数完毕立即
  • 动态存储变量是程序执行过程中使用它时才分配存储单元, 使用完毕立即释放。典型例子是函数形式参数,函数定义时并不给形参分配存储单元,只是函数被调用时,才予以分配,调用函数完毕立即释放。如果一...
  • 形式参数当作过程的局部变量处理, 即被调过程的活动记录开辟了形参存储空间,这些存储位置即是我们所说的实参或形式单元。 2.调用过程计算实参的值,并将它们的右值(r-value)放在为形式单元开辟的空间。 ...
  • 静态存储和动态存储详解

    千次阅读 2015-04-01 22:29:07
    动态存储变量是程序执行过程中使用它时才分配存储单元, 使用完毕立即释放。 典型例子是函数形式参数,函数定义时并不给形参分配存储单元,只是函数被调用时,才予以分配, 调用函数完毕立即释放。如果...
  • 动态存储变量是程序执行过程中使用它时才分配存储单元, 使用完毕立即释放。 典型例子是函数形式参数,函数定义时并不给形参分配存储单元,只是函数被调用时,才予以分配, 调用函数完毕立即释放。...
  • 动态存储变量是程序执行过程中使用它时才分配存储单元, 使用完毕立即释放。 典型例子是函数形式参数,函数定义时并不给形参分配存储单元,只是函数被调用时,才予以分配,调用函数完毕立即释放。如果...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 169
精华内容 67
关键字:

在存储过程的形参中使用