精华内容
下载资源
问答
  • 主要介绍了MYSQL中重命名procedure的一种方法,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
  • 某台机器上,访问公司的好几个产品网站,都抛出很多 Invalid procedure call or argument ,跟进了下,情况最后简化为
  • 打开IIS随便访问一个.asp文件,提示The remote procedure call failed and did not execute
  • PCIE 4.0 connector high speed electrical test procedure
  • A procedure is described that provides a universal solution for Lambert's problem. Based on the approach of Lancaster and his colleagues, the procedure uses Halley's cubic iteration process to ...
  • 在Access自身的帮助中看到了Create Procedure语句,测试了老半天,终于发现了诀窍:必须使用OleDb连接才能使用Create Procedure语句。ODBC连接不支持该语句,提示Create Table语法错误。 创建了存储过程后,使用...
  • PCIE 4.0 connector high speed electrical test procedure
  • HBase Procedure V2介绍

    2018-08-13 22:07:43
    主要介绍一下Procedure V2的设计和结构,以及为什么用Procedure V2能比较容易实现出正确的AssignmentManager。最后介绍一下最近在2.1分支上对一些Procedure实现修正和改进。
  • win10安装mysql报错The procedure entry point fesetround could not be located in the dynamic link library-附件资源
  • 主要介绍了Oracle Procedure 知识,包括oracle的存储过程注意事项方面的内容,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • 不知道是否遇到过为MySQL表结构该选择什么类型字段而郁闷?或者为MySQL字段该选择多少长度而纠结?下面这篇文章就给大家介绍一个武林秘籍吧~也是我最近才学来的,感兴趣的朋友们下面来一起看看吧。
  • SAP_MRP_PROCEDURE_TYP.pdf

    2021-06-16 19:18:42
    SAP_MRP_PROCEDURE_TYP.pdf
  • 主要介绍了MySQL 5.7 create VIEW or FUNCTION or PROCEDURE的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • SAS Mixed Procedure

    2018-11-30 09:32:53
    SAS Mixed Procedure 最新的SAS使用手册 15.1 全方位了解
  • Procedure-data-源码

    2021-03-20 08:08:14
    Procedure-data
  • 主要介绍了 oracle中 procedure(存储过程)和function(函数)本质区别,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • 几个Oracle procedure实例

    2019-03-21 01:43:24
    NULL 博文链接:https://shihuan830619.iteye.com/blog/952077
  • 英文原版《有限单元法》第2版,K. J Bathe 的经典之作。
  • SQL 存储过程 procedure 讲解+代码实例

    千次阅读 2020-04-09 20:34:02
    存储过程 Stored Procedure3.1. 存储过程概述3.1.1. 存储过程的优点3.1.2. 存储过程的缺点3.2. 创建存储过程 create procedure3.3. 调用存储过程 call3.4. 查看存储过程的定义3.5. 修改存储过程 alter procedure...

    1. 存储过程概述

    存储过程是一种在数据库中存储复杂程序,以便外部程序调用的数据库对象。

    存储过程经编译创建并保存在数据库中,用户可通过指定存储过程的名字和给定参数来调用执行。存储过程思想上很简单,就是数据库SQL语言层面的代码封装与重用。

    作个形象的比喻,存储过程也可以看作是一个"加工厂",它接收"原料"(in参数)然后将这些原料加工处理成"产品"(out/inout参数),再把"产品"交付给"调用者"。

    存储过程的优点

    1. 减少网络流量的使用
    2. 将重复性很高的一系列操作,封装到一个存储过程中,简化了SQL的调用
    3. 批量处理: 通过循环减少流量,也就是“跑批”
    4. 统一接口,确保数据安全。

    存储过程的缺点

    1. 存储过程往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
    2. 存储过程的性能调校与撰写受限于具体的数据库系统。

    2. 创建存储过程 create procedure

    创建存储过程的语法如下:

    create [definer = {user|current_user}] procedure [过程名] ( [参数1],[参数2],...,[参数n] )
    	[[特征1],[特征2],...,[特征n]] 
    	[SQL代码];
    
    -- definer 用于指定存储过程由哪个用户定义,默认是当前用户,注意不是指定存储过程的使用权限
    
    -- [过程名] 该过程名用于指定存储过程,分别用户调用
    
    -- [参数] 参数的形式为:[in|out|inout] [参数名] [参数类型],例如:in pcd_id int、inout pcd_username varchar(3)
    -- -- -- in 表示该参数为输入参数,即调用时传入
    -- -- -- out 表示该参数为输出参数,即存储过程的返回值
    -- -- -- inout 表示该参数即可输入也可输出
    -- -- -- 参数类型 可以是 int或者varchar()
    
    -- [特征] 特征是存储过程的属性,它包括了如下几个可选特征
    -- -- -- comment '' 注释信息,例如:commet '这是一个存储过程'
    -- -- -- language sql 指定存储过程使用的语言为sql
    -- -- -- [not] deterministic 是否指定一个输入仅对应一个输出(映射),包含下面2个可选参数
    -- -- -- -- -- not deterministic(默认),表示不指定映射关系;
    -- -- -- -- -- deterministic,表示指定映射关系
    -- -- -- [contains sql | no sql | reads sql data | modifies sql data] 明确子程序对数据的操作,包含下面4个可选参数
    -- -- -- -- -- contains sql(默认),表示子程序不包含读或者写数据的语句
    -- -- -- -- -- no sql,表示子程序不包含sql
    -- -- -- -- -- reads sql data,表示子程序包含读数据的语句,但是不包含写数据的语句
    -- -- -- -- -- modifies sql data,表示子程序包含写数据的语句
    -- -- -- sql security [definer|invoker] 指定调用权限,包含下面两个可选参数
    -- -- -- -- -- sql security definer(默认),使用创建者权限调用存储过程,不受限制
    -- -- -- -- -- sql security invoker,使用调用者权限调用存储过程,只有被赋予权限的调用者才能调用
    
    

    例如:

    -- 将tab_sale表中sale_name字段值等于传入参数的记录删除
    create procedure delete_sale(in pcd_sale_name varchar(3))
    begin
    	delete from tab_table
    	where tab_table.sale_name= pcd_sale_name ;
    end
    
    2.1. 参数 in、out、inout

    下面三段代码是对存储过程的参数in、out和inout的代码说明:

    -- 创建一个存储过程,参数为in
    create procedure test(in i int)
    begin
    	select i; -- 返回结果i,i=1
    	set i=2;
    	select i; -- 返回结果i,i=2
    end
    
    -- 调用存储过程test,并传入一个参数i=1
    set @i = 1; -- 定义全局变量i
    call test(@i);
    select @i; -- 返回结果i,i=1
    
    -- 由以上代码可知当存储过程的参数为in时,会传入变量的值,并且存储过程内部的赋值不会影响到外部传入的变量
    
    -- 创建一个存储过程,参数为out
    create procedure test(out i int)
    begin
    	select i; -- 返回结果i,i=Null
    	set i=2;
    	select i; -- 返回结果i,i=2
    end
    
    -- 调用存储过程test,并传入一个参数i=1
    set @i=1; -- 定义全局变量i
    call test(@i);
    select @i; -- 返回结果i,i=2
    
    -- 由以上代码可知当存储过程的参数为out时,变量的值不会被传入,并且存储过程内部的赋值运算可以影响到外部传入的变量
    
    -- 创建一个存储过程,参数为inout
    create procedure test(inout i int)
    begin
    	select i; -- 返回结果i,i=1
    	set i=2;
    	select i; -- 返回结果i,i=2
    end
    
    -- 调用存储过程test,并传入一个参数i=1
    set @i=1; -- 定义全局变量i
    call test6(@i);
    select @i; -- 返回结果i,i=2
    
    -- 由以上代码可知当存储过程的参数为out时,会传入变量的值,并且存储过程内部的赋值运算可以影响到外部传入的变量
    

    3. 调用存储过程 call

    存储过程的调用使用call关键字
    例如:

    -- 将tab_sale表中sale_name字段值等于'辣条'的记录删除
    create procedure delete_sale(in pcd_sale_name varchar(3))
    delete from tab_table
    where tab_table.sale_name= pcd_sale_name ;
    
    -- 调用存储过程delete_sale
    call delete_sale('辣条');
    

    4. 查看存储过程

    4.1. 查看存储过程的状态

    语法如下:

    show procedure status like '[状态名]';
    

    [状态名]可以查看博客:show status 查看各种状态

    例如:

    --查看查询时间超过long_query_time秒的查询的个数。
    show procedure status like 'slow_queries';
    
    4.2. 查看存储过程的定义

    语法如下:

    show create procedure '[过程名]'
    

    例如:

    -- 查看存储过程delete_sale的定义
    show create procedure delete_sale
    

    结果如下:

    Proceduresql_modeCreate Procedurecharacter_set_clientcollation_connectionDatabase Collation
    delete_saleONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTIONCREATE DEFINER=`root@localhostPROCEDUREdelete_sale`(in pcd_num int) delete from tab_sale where tab_sale.num = pcd_numutf8mb4utf8mb4_0900_ai_ciutf8mb4_0900_ai_ci
    4.2. 从information_schema.Routines表查看存储过程的信息 mysql

    MySQL数据库的所有存储过程的信息都保存在information_ schema数据库中的routines表中,因此可以使用select语句查询存储过程的相关信息。

    语法为:

    select * from information_schema.ROUTINES
    where routine_name='[过程名]'
    

    例如下面的SQL语句是查看存储过程delete_sale相关信息的语句。

    select * from information_schema.ROUTINES
    where routine_name='delete_sale'
    

    执行结果如下:

    SPECIFIC_NAMEROUTINE_CATALOGROUTINE_SCHEMAROUTINE_NAMEROUTINE_TYPEDATA_TYPE
    delete_saledefsqlcourse4delete_salePROCEDURE

    5. 修改存储过程 alter procedure

    修改存储过程的特性可以使用alter procedure关键字,语法如下:

    alter procedure [存储过程名] [特性]
    

    例如:

    -- 修改存储过程delete_sale,使它可以写数据(modifies sql data)
    alter procedure delete_sale modifies sql data;
    

    6. 删除存储过程 drop procedure

    语法:

    drop procedure [if exists] [存储过程名]
    

    例如:

    -- 如果存储过程delete_sale存在,则删除它
    drop procedure if exists delete_sale;
    

    存储过程和函数的博客分为三章,链接分别为:

    1. SQL 存储过程 procedure 讲解+代码实例
    2. SQL 函数 function 讲解+代码实例
    3. SQL 存储过程和函数的对比、变量、条件和处理程序、游标、流程控制详解+代码示例
    展开全文
  • C#写的WinForm版执行Oracle Procedure的工具源码,是用VS2010编写的。
  • Procedure Call Standard for the ARM 64-bit Architecture (AArch64)
  • Oracle——存储过程 procedure 的创建

    千次阅读 2020-09-27 15:54:09
    创建存储过程的语法 使用关键字create、procedure,关键字后面时过程名字和参数列表,其基本语法如下: create [or replace] procedure pro_name [(parameter1 [,parameter2]...)] is|as begin plsql_sentences;...

     被内容来自《oracle从入门到精通——明日科技》一书

      存储过程是一种命名的PL/SQL程序快,存储过程被保存在数据库中,它不可以被SQL语句直接执行或调用,只能通过EXECUT命令执行或在PL/SQL程序快中内部调用。由于存储过程是已经编译好的代码,所以在被调用或引用时,其执行效率非常高。本次所有操作均在Oracle 19c本版。

    目录

    1.创建存储过程

      1.1.创建存储过程的语法

      1.2.下面通过一个实际例子来解释如何创建一个存储过程。

      1.3.执行存储过程

    2.存储过程的关键字

      2.1.IN模式参数

      2.2.OUT模式


    1.创建存储过程

      1.1.创建存储过程的语法

        使用关键字create、procedure,关键字后面时过程名字和参数列表,其基本语法如下: 

    create [or replace] procedure pro_name [(parameter1 [,parameter2]...)] is|as
    begin
        plsql_sentences;
    [exception]
        [dowith_sentences;]
    end [pro_name];

        1.1.1.pro_name:存储过程的名字。如果数据库存在该名字,可以加上or replace ,这样新的存储过程就会覆盖掉原来已经存在的存储过程。

        1.1.2.parameter1:存储过程的参数。如果输入参数则需要在后面使用in关键字,如果输出参参数则在后面使用out关键字。in和out关键字后面是参数的类型,不能指定参数类型的长度。

        1.1.3.plsql_sentences:PL/SQL语句。它是存储过程实现的主体。

        1.1.4.dowith_sentences:异常处理语句。也是PL/SQL语句,可以没有。

        1.1.5.在创建存储过程中IS关键字也可以用AS代替,效果是一样的。

      1.2.下面通过一个实际例子来解释如何创建一个存储过程。

        假如有一个表:

    create table t_user(
        t_name varchar2(20) not null,
        t_address varchar2(100) not null     
    )tablespace test_data;

        下面创建一个存储过程,向表user插入数据:

    create procedure add_data_to_user is
    begin
        insert into t_user (t_name,t_address) values ('tony','shanghai');--插入数据的sql语句,存储过程的实体
        commit;--提交事务
        dbms_output.put_line('新插入数据成功!');--插入数据成功返回的信息提示,可以没有
    end add_data_to_user;

        上的存储过程为:向表user插入一条记录,存储过程的名字是add_data_to_user。如果在当前模式下数据库已经存在名为add_data_to_user的存储过程,则使用or replace关键字创建,如下:

    create or replace procedure add_data_to_user is
    begin
        insert into t_user (t_name,t_address) values ('simth','beijing');--插入数据的sql语句,存储过程的实体
        commit;--提交事务
        dbms_output.put_line('新插入数据成功!');--插入数据成功返回的信息提示,可以没有
    end add_data_to_user;

        这就会覆盖之前创建的同名的存储过程。如果不存在则为直接创建名为add_data_to_user的存储过程。

        如果创建的过程中出现的错误,用户可以使用'show error'命令查看错误信息。

    创建好的存储过程会被保存在procedure中,如:

    如果绿色图标有个红色的星号则说明创建失败。 

        上面的存储过程主体inert语句仅仅是被编译了,并没有执行,下面说一下如何执行。

      1.3.执行存储过程

        在SQL*Plus环境下,执行存储过程使用关键字execute命令执行存储过程的名字即可,语句如下:

    execute add_data_to_user;

        在PL/SQL中执行存储过程语句为:

    begin
        add_data_to_user;
    end;

    2.存储过程的关键字

      Oralce为了增强存储过程的灵活性,提供向存储过程传入参数的功能。存储过程可以接受多个参数,参数模式包括:IN、OUT、INOUT三种。

      2.1.IN模式参数

        这是一种输入型参数。参数值由调用方传入,并且只能被存储过程使用读取。这种模式是最长用的,也是默认的。

        用法:parameter_name IN paramter_type,即(参数名称 IN 参数类型)。需要注意的是参数类型不能指定长度。

        下面创建一个IN模式的存储过程:

    create or replace procedure insert_data_to_user(
           d_name in varchar2,--参数一
           d_address in varchar2--参数二
    ) is 
    begin 
      insert into t_user (t_name,t_address) values(d_name,d_address);--存储过程的实体,向表中插入数据
      commit;--提交事务
    end;

         向存储过程传递参数有三种方式:

        2.1.1.制定名称传递

          制定名称传递是指在向存储过程传递参数时需要指定参数的名称,即参数名称在左,中间是赋值符号“=>”,右侧是参数值。其语法如下:

    pro_name(parameter1=>value1[,parameter2=>value2...])  

                         parameter1:参数名称。在传递参数时,这个参数名称的顺序和存储过程定义的顺序无关。
          value2:参数值。参数值的类型要和存储过程中定义的类型相兼容。
          =>:是一种新的赋值符号。
     下面是按照制定名称方式执行我们刚才创建的存储过程:

    --第一种方式
    SQL> begin
      2  insert_data_to_user(d_name=>'张三',d_address => '上海');
      3  end;
      4  /
    
    PL/SQL procedure successfully completed
    --第二种方式
    SQL> begin
      2  insert_data_to_user(d_address=>'北京',d_name => '李四');
      3  end;
      4  /
    
    PL/SQL procedure successfully completed

                我们可以看到第一种方式是按照存储过程中定义的顺序传递参数的,第二种方式没有按照存储过程中定义的顺序传递参数,但都执行成功了。可以看到表中现在存在了这两个记录:

    SQL> select * from t_user;
    
    T_NAME               T_ADDRESS
    -------------------- --------------------------------------------------------------------------------
    tony                 shanghai
    tony                 shanghai
    张三                 上海
    李四                 北京
    
    SQL> 

        2.1.2.按位置传递

          按指定名称传递参数时虽然直观易读,但也有缺点,就是如果参数过多时,代码就会冗余。因此我们可以采取按位置传递。但需要注意的是,采取这种方式我们要保证传递的参数值要和存储过程中定义的顺序一致。接下来我们还以

    insert_data_to_user存储过程为例向中传递参数:

    begin
      insert_data_to_user('CSDN ','位置不详');
      insert_data_to_user('北京市朝阳区 ','九零大叔芭蕉');
    end;

    下面是数据添加的情况:

    SQL> select * from t_user;
    
    T_NAME               T_ADDRESS
    -------------------- --------------------------------------------------------------------------------
    tony                 shanghai
    tony                 shanghai
    张三                 上海
    李四                 北京
    CSDN                 位置不详
    北京市朝阳区         九零大叔芭蕉
    
    6 rows selected
    
    
    SQL> 

          有的时候参数过多时,我们记不住参数的类型和顺序,这时我们可以使用desc命令查看存储过程中的参数定义信息,如:

    SQL> desc insert_data_to_user;
    Parameter Type     Mode Default? 
    --------- -------- ---- -------- 
    D_NAME    VARCHAR2 IN            
    D_ADDRESS VARCHAR2 IN    

        2.1.3.混合方式传递

          混合方式就是将前面两种方式结合到一起使用。为了方便测试我们重新新建一个存储过程,具有多个参数的存储过程:

    --创建表t_product
    create table t_product(
           p_id number not null,
           p_name varchar2(50) not null,
           p_count number,
           p_price number,
           p_area varchar2(200)
    )tablespace TEST_DATA;
    
    --添加表、字段注释
    comment on table t_product is'产品/商品表 ';
    comment on column t_product.p_id is '主键 ';
    comment on column t_product.p_name is '产品名称 ';
    comment on column t_product.p_count is '产品数量 ';
    comment on column t_product.p_price is '产品价格 ';
    comment on column t_product.p_area is '产品生产地区 ';
    
    --创建Sequence
    create sequence seq_product_id
    minvalue 1
    maxvalue 99999999999
    start with 1
    increment by 1
    cache 20;
    
    --创建存储过程
    create or replace procedure  insert_data_to_product(
           d_name in varchar2,
           d_count in number,
           d_price in number,
           d_area in varchar2
    ) is 
    begin
      insert into t_product values(seq_product_id.nextval,d_name,d_count,d_price,d_area);
      commit;
    end;

          我们创建了一个名为:insert_data_to_product的存储过程,参数有d_name,d_count,d_price,d_area。其中表的主键id通过我们创建的序列seq_product_id产生。下面我们来通过混合方式传递参数执行这个存储过程:

    SQL> begin
      2  insert_data_to_product('apple',100,d_price => 5,d_area => 'china');
      3  end;
      4  /
    
    PL/SQL procedure successfully completed

          需要注意的是:在某个位置使用了按名称传递方式后,其后面的参数也要使用按名称传递。因为按名称传递的方式有可能已经破坏了参数原始的定义顺序。

      2.2.OUT模式

        本次我们需要用到表t_product,里面的数据为:

    SQL> select * from t_product;
    
          P_ID P_NAME                                                P_COUNT    P_PRICE P_AREA
    ---------- -------------------------------------------------- ---------- ---------- --------------------------------------------------------------------------------
             1 apple                                                     100          5 china
             2 汽车                                                       20     100000 美国
             3 飞机                                                       10   65900000 美国
             4 大豆                                                   300000        2.2 巴西
             5 手机                                                   300000       3200 中国

        OUT模式是一种输出类型的参数。表示这个参数在存储过程中已经被赋值,并且可以将这个参数传递到存储过程之外的环境中去。关键字位于参数名称之后,和IN 模式相似。下面定义一个OUT模式的存储过程:

    create or replace procedure get_data_from_product (
           g_id in number,       --声明一个输入变量参数
           g_name out varchar2,  --声明一个输出变量
           g_count out varchar2  --声明一个输出变量
    ) is
    begin
      select p_name,p_count into g_name,g_count from t_product where p_id=g_id;--存储过程主体,根据传入的id查询产品的名字和数量
    end;

        在上面的存储过程中定义了两个OUT类型的参数,因为OUT模式需要输出参数,所以定义两个参数用来接受返回值。

        2.2.1.在PL/SQL中调用OUT模式的存储过程

          这种方式需要在PL/SQL块中通过declare定义与存储过程中OUT参数相兼容的变量,如:

    SQL> set serveroutput on 
    SQL> declare
      2  var_name t_product.p_name%type;
      3  var_count t_product.p_count%type;
      4  begin
      5  get_data_from_product(2,var_name,var_count);
      6  dbms_output.put_line(var_name);
      7  dbms_output.put_line(var_count);
      8  end;
      9  /
    
    汽车
    20
    
    PL/SQL procedure successfully completed

           在这段代码中我们首先声明了两个变量var_name和var_count,变量类型要和存储过程中定义的OUT变量相兼容。然后把两个变量传入到存储过程中,当存储过程被执行时,其中out参数会被赋值,当存储过程执行完之后,OUT参数的值会在会在调用处返回。这样定义的两个变量就可以得到OUT参数被赋予的值了。

        2.2.2.使用exec命令执行OUT模式的存储过程

          使用exec命令需要在SQL*Plus环境中使用variable关键字声明两个变量,将声明的了两个变量接受OUT参数的返回值。如:

    SQL> variable v_name varchar2(50);
    SQL> variable v_count number;
    SQL> exec get_data_from_product(3,:v_name,:v_count);
    
    PL/SQL procedure successfully completed
    
    v_name
    ---------
    飞机
    v_count
    ---------
    10

          我们还可以使用print或者select命令来查看变量的值如:

    SQL> print v_name;
    v_name
    ---------
    飞机
    
    SQL> 
    SQL> print v_count;
    v_count
    ---------
    10
    
    
    SQL> select :v_name,:v_count from dual;
    
    :V_NAME                                                                            :V_COUNT
    -------------------------------------------------------------------------------- ----------
    飞机                                                                                     10
    v_name
    ---------
    飞机
    v_count
    ---------
    10


    该文章在我的博客园地址

    展开全文
  • PostgreSql存储过程模板(PROCEDURE

    万次阅读 2021-03-17 15:00:40
    PROCEDURE 语法 CREATE [ OR REPLACE ] PROCEDURE name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] ) { LANGUAGE lang_name | TRANSFORM { FOR TYPE type_name } [, ... ]...

    PROCEDURE

    语法

    CREATE [ OR REPLACE ] PROCEDURE
        name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
      { LANGUAGE lang_name
        | TRANSFORM { FOR TYPE type_name } [, ... ]
        | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
        | SET configuration_parameter { TO value | = value | FROM CURRENT }
        | AS 'definition'
        | AS 'obj_file', 'link_symbol'
      } ...
    

    CREATE PROCEDURE定义一个新的过程。CREATE OR REPLACE PROCEDURE将会创建一个新过程或者替换一个已有的定义。为了能够定义过程,用户必须具有所使用的语言上的USAGE特权。

    如果这个命令中包括了一个方案名称,则该过程将被创建在该方案中。否则过程将被创建在当前的方案中。新过程的名称不能匹配同一方案中具有相同输入参数类型的任何现有过程或函数。不过,具有不同参数类型的过程和函数可以共享同一个名称(这被称为重载)。

    要替换一个已有过程的当前定义,请使用CREATE OR REPLACE PROCEDURE。不能用这种方式更改过程的名称或者参数类型(如果尝试这样做,实际上会创建一个新的、不同的过程)。

    当CREATE OR REPLACE PROCEDURE被用来替换一个现有的过程时,该过程的拥有关系和权限保持不变。所有其他的过程属性会被赋予这个命令中指定的或者暗示的值。必须拥有(包括成为拥有角色的成员)该过程才能替换它。

    创建过程的用户将成为该过程的拥有者。

    为了能够创建一个过程,用户必须具有参数类型上的USAGE特权。

    参数

    name

    要创建的过程的名称(可以是被方案限定的)。 
    

    argmode

    参数的模式可以是:IN、INOUT或者VARIADIC。如果省略,则默认为IN(当前对过程不支持OUT参数,可使用INOUT)。 
    

    argname

    参数的名称。 
    

    argtype

    过程的参数(如果有)的数据类型(可以是被方案限定的)。参数类型可以是基础类型、组合类型或者域类型,或者可以引用一个表列的类型。
    
    根据具体的实现语言,还可能可以指定“伪类型”,例如cstring。伪类型表示实际的参数类型没有完全确定,或者是位于普通SQL数据类型的集合之外。
    
    写上table_name.column_name%TYPE可以引用某个列的类型。使用这种特性有时可以让过程不受表定义改变的影响。 
    

    default_expr

    没有指定参数时要被用作默认值的表达式。这个表达式必须符合该参数的参数类型。跟在有默认值的参数后面的输入参数也都必须有默认值。 
    

    lang_name

    用于实现该过程的语言名称。它可以是sql、c、internal或者一种用户定义的过程语言的名称,例如plpgsql。将名称包裹在单引号内的方式已经被废弃,并且要求大小写匹配。 
    

    TRANSFORM { FOR TYPE type_name } [, … ] }

    列出对过程的调用应该应用哪些Transform。Transform负责在SQL类型和语言相关的数据类型之间进行转换,请参考CREATE TRANSFORM。过程语言实现通常采用硬编码的方式保存内建类型的知识,因此它们无需在这里列出。但如果一种过程语言实现不知道如何处理一种类型并且没有提供Transform,它将回退到默认的行为来转换数据类型,但是这依赖于其实现。 
    

    [EXTERNAL] SECURITY INVOKER
    [EXTERNAL] SECURITY DEFINER

    SECURITY INVOKER指示过程以调用它的用户的特权来执行。这是默认方式。SECURITY DEFINER指定过程以拥有它的用户的特权来执行。
    
    为了符合SQL标注,允许使用EXTERNAL关键词,但它是可选的,因为和SQL中不同,这个特性适用于所有的过程而不仅仅是外部过程。
    
    SECURITY DEFINER过程不能执行事务控制语句(例如COMMIT和ROLLBACK,具体取决于实现的语言)。 
    

    configuration_parameter
    value

    SET子句导致在进入该过程时指定的配置参数被设置为指定的值,并且在过程退出时恢复到之前的值。SET FROM CURRENT把CREATE PROCEDURE执行时该参数的当前值保存为在进入该过程时要应用的值。
    
    如果对过程附加一个SET子句,那么在该过程中为同一个变量执行的SET LOCAL命令的效果就被限制于该过程:在过程退出时还是会恢复到该配置参数的以前的值。不过,一个普通的SET命令(没有LOCAL)会重载这个SET子句,很像它对一个之前的SET LOCAL命令所做的事情:这样一个命令的效果将持续到过程退出之后,除非当前事务被回滚。
    
    如果对过程附加一个SET子句,则该过程不能执行事务控制语句(例如COMMIT和ROLLBACK,具体取决于实现的语言)。
    

    definition

    一个定义该过程的字符串常量,其含义取决于语言。它可以是一个内部的过程名、一个对象文件的路径、一个SQL命令或者以一种过程语言编写的文本。
    
    在编写过程的定义字符串时,使用美元引用 而不是普通的单引号语法常常会很有帮助。如果没有美元引用,过程定义中的任何单引号或者反斜线必须以双写的方式进行转义。 
    

    obj_file, link_symbol

    当C语言源码中的过程名与SQL过程的名称不同时,这种形式的AS子句被用于动态可装载的C语言过程。字符串obj_file是包含已编译好的C过程的共享库文件名,并且被按照LOAD命令的方式解析。字符串link_symbol是该过程的链接符号,也就是该过程在C语言源代码中的名称。如果链接符号被省略,则会被假定为与正在被定义的SQL过程的名称相同。
    
    当重复的CREATE PROCEDURE调用引用同一个对象文件时,只会对每一个会话装载该文件一次。要卸载或者重新载入该文件(可能是在开发期间),应该开始一个新的会话。 
    

    存储过程模板

    存储过程日志表

    CREATE TABLE public.sys_procedurelog (
    	id serial NOT NULL,
    	logger varchar(50) NULL,
    	procedurename varchar(50) NULL,
    	timespan int4 NULL,
    	errcode varchar(5) NULL,
    	errmessage varchar(200) NULL,
    	logtime timestamp NULL,
    	issuccess bool NULL,
    	CONSTRAINT sys_procedurelog_pkey PRIMARY KEY (id)
    );
    CREATE INDEX "NON-ProcedureName-sys_procedurelog" ON public.sys_procedurelog USING btree (procedurename);
    
    

    存储过程模板

    CREATE OR REPLACE PROCEDURE public.proc_template(INOUT sys_errcode character varying)
     LANGUAGE plpgsql
    AS $procedure$
    
    --author:zhangyongze
    --createdat:2021年3月17日16点38分
    
    declare    --  定义变量
    
    sys_starttime  timestamp;
    sys_errmessage varchar(200);
    
    iloop int;
    begin   --事务开始    
      
    sys_errcode='00000';
    sys_starttime = now();
    iloop=1;
    
    
     begin     -- 为记日志需要再开一个begin
    
    while (iloop<3)  loop  --  循环
    
    insert  into  tm_template values(iloop);
    
    iloop=iloop+1;
    end loop;
    
     
     -- create  table  tm_example as  select * from tm_examplez;
    
    
     
      
    --捕获异常并回滚
    
    exception when others then rollback;
        get stacked diagnostics 
    	sys_errcode = returned_sqlstate,sys_errmessage = message_text;
     end ;
    
    	-----删除临时表
    --	drop table if exists tm_template ;
     
     
    
    -----日志记录生成模块
    	insert into sys_procedurelog(issuccess,logger,procedurename,timespan,errcode,errmessage,logtime)
    	select 
    		   case when sys_errcode ='00000' then 1::bool else 0::bool end as issuccess,
               'template' as logger,
               'proc_template'    as procedurename,
               floor(extract(epoch  from (now() -  sys_starttime)))   as timespan,
    		   case when sys_errcode='00000'then null else sys_errcode end    as errcode,
               case when sys_errcode='00000' then null else sys_errmessage end as errmessage,
               now() as logtime;
              
    end;
    $procedure$
    ;
    
    
    展开全文
  • procedure的例子

    2015-01-12 14:50:37
    关于MySQL的存储过程 存储过程是数据库存储的一个重要的功能,但是MySQL在5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。
  • store procedure

    2015-10-21 06:23:23
    sql server procedure
  • - MySQL - 存储过程 Stored Procedure

    千次阅读 2019-07-06 18:35:07
    when var>0 then when var循环语句 1、while ···· end while: while 条件 do --循环体 endwhile mysql > DELIMITER // mysql > CREATE PROCEDURE proc4() -> begin -> declare var int; -> set var=0; -> ...


    存储过程是什么

    存储过程是一组为了完成特定功能的SQL语句集,存储在数据库中,一次编译多次使用,用户通过指定存储过程的名字并传入必要的参数来调用执行它;

    存储过程就是数据库语言层面的代码封装与重用;


    存储过程的优点

    • 将重复性很高、复杂的一些操作,封装到一个存储过程中,简化了对这些SQL的调用;
    • 可以重复使用,减少数据库开发人员的工作量;
    • 一次编译多次调用执行,可以提高数据库执行速度;
      存储过程只在创建的时候进行编译,以后每次调用的时候不需要再编译,一般的SQL语句每次执行都要先编译;
    • 可以使用SQL+循环进行批处理;
    • 存储过程存放在服务器上,调用的时候只需要传递存储过程的名称和必要的参数就可以了,降低了网络传输的数据量;
    • 参数化的存储过程可以防止SQL注入,也可以给存储过程设置权限,确保了数据的安全;

    存储过程的缺点

    • 可移植性差:不同数据库的存储过程的语法不同,切换数据库时需要重新编写存储过程;
    • 每个数据库的存储过程语法几乎都不一样,十分难以维护(不通用);
    • 调试麻烦;

    存储过程分类

    1、系统存储过程:以sp_开头,用来进行系统的各项设定、取得信息、相关管理工作;

    2、本地存储过程:一般说的存储过程就是本地存储过程,是由用户创建的,用来完成某一特定功能;

    3、临时存储过程:(sql server)
    本地临时存储过程:以#作为名称的开头;只有创建的用户自己能使用;
    全局临时存储过程:以##作为名称的开头;连接到数据库服务器的用户都能调用;

    4、远程存储过程:(sql server)

    5、扩展存储过程:用户可以使用外部程序语言编写的存储过程,名字通常以xp开头;


    存储过程的查询语句

    查看某个数据库下面的存储过程:
    select pName from mysql.proc where db='数据库名';
    select routine_name from information_schema.routines where routine_schema='数据库名';
    show procedure status where db='数据库名';

    查看存储过程的详细信息:show create procedure dbName.pName;

    修改存储过程:alter procedure procedureName;

    删除存储过程:drop procedure procedureName;


    存储过程的创建和调用

    https://www.runoob.com/w3cnote/mysql-stored-procedure.html

    语法

    delimiter $$
    
    create  [definer = { user | current_user}] 
        procedure  sp_name (in/out/inout  参数名  参数类型)
        [characteristic ...] 
        routine_body
      
    characteristic:
       	  comment  'string'
    	  | LANGUAGE SQL
    	  | [NOT] DETERMINISTIC
    	  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    	  | SQL SECURITY { DEFINER | INVOKER }
     
    routine_body:
      Valid SQL routine statement
     
    [begin_label:] BEGIN
      [statement_list]
        ……
    END [end_label]
    
    delimiter ;
    

    1、delimiter $$:修改语句结束符;
    语句结束符表示语句已经结束,MySQL可以执行语句了;

    在定义存储过程前,将语句结束符临时修改为$$(符号随意定),使得存储过程的过程体中使用的;被直接传递到服务器,而不会被客户端解释;
    存储过程结束后,要将语句结束符改为默认的;delimiter ;


    2、create procedure p_name(IN/OUT/INOUT p_in int, ...):声明存储过程;
    默认情况下,存储过程和默认数据库相关联,如果想指定存储过程创建在某个特定的数据库下,那么在过程名前面加数据库名做前缀;

    如果过程没有参数,也必须在过程名后面写上小括号;

    • IN: 输入参数,表示调用者向过程传入值;
      用来接收调用者调用存储过程时传入的参数;可以传入字面值、或变量;
    • OUT:输出参数,表示调用者向过程传入值;
      用来向调用者返回值,传出值只能是变量;
    • INOUT:输入输出参数,既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量);尽量少使用inout;

    3、begin ... end$$:定义存储过程体;

    • 存储过程体包含了在过程调用时必须执行的语句,例如:dml、ddl语句,if-then-else和while-do语句、声明变量的declare语句等;
    • 过程体格式:以begin开始,以end结束(可嵌套);
    • 可以为语句块帖标签:增强代码的可读性,在某些语句(例如:leave和iterate语句),需要用到标签;
      在这里插入图片描述

    4、set @p_in=1;:变量赋值;


    5、declare id int unsigned default 100;:声明变量;
    过程体中声明的是局部变量,直接使用sql语句声明的是全局变量;使用set为变量赋值时,在过程体中修改变量的值,不影响全局变量的值;


    6、call pName(参数列表);:调用存储过程;


    7、变量的作用域:
    内部的变量在其作用域范围内享有更高的优先权,当执行到 end 变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储过程外再也不能找到这个申明的变量,但是可以通过 out 参数或者将其值指派给会话变量来保存其值;


    实例 - IN、OUT、INOUT

    1、删除给定球员参加的所有比赛:

    mysql> delimiter $$  #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
    mysql> CREATE PROCEDURE delete_matches(IN p_playerno INTEGER)
        -> BEGIN
        ->   DELETE FROM MATCHES  WHERE playerno = p_playerno;
        -> END$$
    Query OK, 0 rows affected (0.01 sec) 
    mysql> delimiter;  #将语句的结束符号恢复为分号
    

    2、IN 输入参数:

    mysql> delimiter $$
    mysql> create procedure in_param(in p_in int)
        -> begin
        ->   select p_in;
        ->   set p_in=2;
        ->    select P_in;
        -> end$$
    mysql> delimiter ; 
    mysql> set @p_in=1; 
    mysql> call in_param(@p_in);
    输出12
    mysql> select @p_in;
    输出1
    

    以上可以看出,p_in 在存储过程中被修改,但并不影响 @p_id 的值,因为前者为局部变量、后者为全局变量;

    3、OUT 输出参数:

    mysql> delimiter //
    mysql> create procedure out_param(out p_out int)
        ->   begin
        ->     select p_out;
        ->     set p_out=2;
        ->     select p_out;
        ->   end //
    mysql> delimiter ;
    mysql> set @p_out=1; 
    mysql> call out_param(@p_out);
    	先输出NULL,因为out是向调用者输出参数,不接收输入的参数,所以存储过程里的p_out为null
    	再输出2,因为过程体中使用set为输出参数赋值为2; 
    mysql> select @p_out;
    	输出2;调用了out_param存储过程,输出参数,改变了p_out变量的值;
    

    4、INOUT 输入输出参数:

    mysql> delimiter $$
    mysql> create procedure inout_param(inout p_inout int)
        ->   begin
        ->     select p_inout;
        ->     set p_inout=2;
        ->     select p_inout;
        ->   end
        -> $$
    mysql> delimiter ; 
    mysql> set @p_inout=1; 
    mysql> call inout_param(@p_inout);
    	输出12 
    mysql> select @p_inout;
    	输出2
    #调用了inout_param存储过程,接受了输入的参数,也输出参数,改变了变量
    

    5、变量定义与赋值:

    • 在客户端使用变量:
      在这里插入图片描述
    • 在存储过程中使用用户变量:
      在这里插入图片描述
    • 在存储过程间传递全局范围的用户变量:
      在这里插入图片描述

    条件语句

    1、if-then-else 语句:

    mysql > DELIMITER //  
    mysql > CREATE PROCEDURE proc2(IN parameter int)  
         -> begin 
         -> declare var int;  
         -> set var=parameter+1;  
         -> if var=0 then 
         -> insert into t values(17);  
         -> end if;  
         -> if parameter=0 then 
         -> update t set s1=s1+1;  
         -> else 
         -> update t set s1=s1+2;  
         -> end if;  
         -> end;  
         -> //  
    mysql > DELIMITER ;
    

    2、case语句:

    mysql > DELIMITER //  
    mysql > CREATE PROCEDURE proc3 (in parameter int)  
         -> begin 
         -> declare var int;  
         -> set var=parameter+1;  
         -> case var  
         -> when 0 then   
         -> insert into t values(17);  
         -> when 1 then   
         -> insert into t values(18);  
         -> else   
         -> insert into t values(19);  
         -> end case;  
         -> end;  
         -> //  
    mysql > DELIMITER ; 
    case
        when var=0 then
            insert into t values(30);
        when var>0 then
        when var<0 then
        else
    end case
    

    循环语句

    1、while ···· end while

    while 条件 do
        --循环体
    endwhile
    
    mysql > DELIMITER //  
    mysql > CREATE PROCEDURE proc4()  
         -> begin 
         -> declare var int;  
         -> set var=0;  
         -> while var<6 do  
         -> insert into t values(var);  
         -> set var=var+1;  
         -> end while;  
         -> end;  
         -> //  
    mysql > DELIMITER ;
    

    2、repeat···· end repea:在执行操作后检查结果,而 while 则是执行前进行检查;

    repeat
        --循环体
    until 循环条件  
    end repeat;
    
    mysql > DELIMITER //  
    mysql > CREATE PROCEDURE proc5 ()  
         -> begin   
         -> declare v int;  
         -> set v=0;  
         -> repeat  
         -> insert into t values(v);  
         -> set v=v+1;  
         -> until v>=5  
         -> end repeat;  
         -> end;  
         -> //  
    mysql > DELIMITER ;
    

    3、loop ·····endloop:loop 循环不需要初始条件,这点和 while 循环相似,同时和 repeat 循环一样不需要结束条件, leave 语句的意义是离开循环;

    mysql > DELIMITER //  
    mysql > CREATE PROCEDURE proc6 ()  
         -> begin 
         -> declare v int;  
         -> set v=0;  
         -> LOOP_LABLE:loop  
         -> insert into t values(v);  
         -> set v=v+1;  
         -> if v >=5 then 
         -> leave LOOP_LABLE;  
         -> end if;  
         -> end loop;  
         -> end;  
         -> //  
    mysql > DELIMITER ;
    

    4、LABLES 标号:标号可以用在 begin repeat while 或者 loop 语句前,语句标号只能在合法的语句前面使用;可以跳出循环,使运行指令达到复合语句的最后一步;

    迭代

    ITERATE 通过引用复合语句的标号,来从新开始复合语句:

    mysql > DELIMITER //  
    mysql > CREATE PROCEDURE proc10 ()  
         -> begin 
         -> declare v int;  
         -> set v=0;  
         -> LOOP_LABLE:loop  
         -> if v=3 then   
         -> set v=v+1;  
         -> ITERATE LOOP_LABLE;  
         -> end if;  
         -> insert into t values(v);  
         -> set v=v+1;  
         -> if v>=5 then 
         -> leave LOOP_LABLE;  
         -> end if;  
         -> end loop;  
         -> end;  
         -> //  
    mysql > DELIMITER ;
    

    MySQL存储过程学习使用之创建、修改、删除、调用

    展开全文
  • SQL存储过程(Stored Procedure

    千次阅读 2019-06-20 16:21:36
    存储过程(procedure)类似于C语言中的函数 用来执行管理任务或应用复杂的业务规则 存储过程可以带参数,也可以返回结果 存储过程可以包含数据操纵语句、变量、逻辑 控制语句等 存储过程...
  • postgresql 11 store procedure 初探之一

    千次阅读 2019-10-21 10:31:34
    postgresql 11 之前的函数(function)和存储过程(procedure)为同义词,语法如下: CREATE [OR REPLACE] FUNCTION function_name (arguments) RETURNS return_datatype AS $variable_name$ DECL...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 359,974
精华内容 143,989
关键字:

procedure