缅甸新锦江赌场-官方网站

English 浙江双荣电子
0577-62816098

产品分类

/PRODUCTS

  联系我们

双荣在线
双荣在线
CONTACT US

电话:0577-62816098

传真:0577-62816098

E-mail:1620486953@qq.com

新闻分类

/NEWS

新闻中心

当前位置:首页 >> 新闻中心 >> 详解二次接线端子铜质螺丝材质之普通黄铜

MySQL数据库的积攒进度,MySQL存款和储蓄进程的创导及调用

来源:缅甸新锦江 2019-07-27 17:56

5、调用

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 ;  #将语句的结束符号恢复为分号

Oracle数据库之PL/SQL进度与函数

PL/SQL块分为佚名块与命名块,命名块又包罗子程序、包和触发器。

经过和函数统称为PL/SQL子程序,我们能够将商业逻辑、公司规则写成进程或函数保存到数据库中,以便共享。

经过和函数均存款和储蓄在数据库中,并透过参数与其调用者交流音讯。进度和函数的并世无两分裂是函数总向调用者重返数据,而经过不回来数据。

一. 存款和储蓄进度概念

存款和储蓄进程(Stored Procedure)是在大型数据库系统中,一组为了成功一定成效的SQL语句集,存款和储蓄在数据库中。经过第2次编写翻译后重新调用无需重新编写翻译,用户通过点名存款和储蓄进度的名字并交给参数(如若该存款和储蓄进程带有参数)来进行它。

储存进程是数据库中的三个首要对象,任何一个陈设优异的数据库应用程序都应该用到存款和储蓄进度。

2. 创建进度

语法:

CREATE [ OR REPLACE ] PROCEDURE [ schema. ] procedure_name
   [ ( parameter_declaration [, parameter_declaration ]... ) ]
   [ invoker_rights_clause ]
   { IS | AS }
   { [ declare_section ] body | call_spec | EXTERNAL} ;

说明:

procedure_name:进度名称。

parameter_declaration:参数申明,格式如下:

parameter_name [ [ IN ] datatype [ { := | DEFAULT } expression ]
          | { OUT | IN OUT } [ NOCOPY ] datatype 

IN:输入参数。

OUT:输出参数。

IN OUT:输入输出参数。

invoker_rights_clause:那么些历程选取何人的权力运维,格式:

AUTHID { CURRENT_USER | DEFINER }

declare_section:注脚部分。

body:进程块主体,实践部分。

相似唯有在承认procedure_name进程是新进度大概要更新的进度时,才使用O奥迪Q三REPALCE关键字,不然轻便删除有用的经过。

示例1:

CREATE PROCEDURE remove_emp (employee_id NUMBER) AS
   tot_emps NUMBER;
   BEGIN
      DELETE FROM employees
      WHERE employees.employee_id = remove_emp.employee_id;
      tot_emps := tot_emps - 1;
   END;

示例2:

CREATE OR REPLACE PROCEDURE insert_emp(
   v_empno     in employees.employee_id%TYPE,
   v_firstname in employees.first_name%TYPE,
   v_lastname  in employees.last_name%TYPE,
   v_deptno    in employees.department_id%TYPE
   )
AS
   empno_remaining EXCEPTION;
   PRAGMA EXCEPTION_INIT(empno_remaining, -1);
BEGIN
   INSERT INTO EMPLOYEES(EMPLOYEE_ID, FIRST_NAME, LAST_NAME, HIRE_DATE,DEPARTMENT_ID)
   VALUES(v_empno, v_firstname,v_lastname, sysdate, v_deptno);
   DBMS_OUTPUT.PUT_LINE('插入成功!');
EXCEPTION
   WHEN empno_remaining THEN
      DBMS_OUTPUT.PUT_LINE('违反数据完整性约束!');
      DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;

三. 应用进程参数

当塑造进度时,既能够钦点进程参数,也足以不提供任何参数。

进程参数包涵输入参数、输出参数和输入输出参数,个中输入参数(IN)用于吸收接纳调用景况的输入数据,输出参数(OUT)用于将出口数据传递到调用境遇,而输入输出参数(IN OUT)不止要收到输入数据,而且还要输出数据到调用情形。

3.1 带有输入参数的进程

由此选取输入参数,能够将应用程序数据传递到进度。当定义进度参数时,默许参数情势是输入参数,此外可以选用IN关键字显式定义输入参数。

示例:

CREATE OR REPLACE PROCEDURE insert_emp(
    empno employee.empno%TYPE,
    ename employee.ename%TYPE,
    job employee.job%TYPE,
    sal employee.sal%TYPE,
    comm IN employee.comm%TYPE,
    deptno IN employee.deptno%TYPE
    )
IS
BEGIN
    INSERT INTO employee VALUES(empno, ename, job, sal, comm, depno);
END;

叁.2 带有输出参数的经过

透过在进度中动用输出参数,能够将数据或消息传递到调用情状和应用程序。当定义输出参数时,须求钦定参数情势OUT。

示例:

CREATE OR REPLACE PROCEDURE update_sal(
    eno NUMBER,
    salary NUMBER,
    name out VARCHAR2) 
IS
BEGIN
    UPDATE employee SET sal=salary WHERE empno=eno
    RETURNING ename INTO name;
END;

三.三 带有输入输出参数的进程

透过在经过中选拔输入输出参数,可以在调用进度时输入数据到进程,在调用甘休后输出数据到调用情形和应用程序。当定义输入输出参数时,必要内定参数形式为IN OUT。

示例:

CREATE OR REPLACE PROCEDURE divide(
    num1 IN OUT NUMBER,
    num2 IN OUT NUMBER) 
IS
    v1 NUMBER;
    v2 NUMBER;
BEGIN
    v1 := trunc(num1 / num2);
    v2 := mod(num1,num2);
    num1 := v1;
    num2 := v2;
END; 

4. 调用进程

当在SQL*PLUS中调用进度时,需求利用CALL只怕EXECUTE命令,而在PL/SQL块中经过可以一贯引用。

ORACLE使用EXECUTE语句来调用存款和储蓄进程语法:

EXEC[UTE] procedure_name(parameter1, parameter2, …);

示例1:

-- 调用删除员工的过程
EXEC remove_emp(1);

-- 调用插入员工的过程
EXECUTE insert_emp(1, 'tommy', 'lin', 2);

示例2:

DECLARE
    v_name employee.ename%type;
BEGIN
    update_sal(&eno,&salary,v_name);
    dbms_output.put_line('姓名:'||v_name);
END;

伍. 函数介绍

函数是一段独立的PL/SQL程序代码,它推行有些特定的、显著的天职。平时,函数将管理从程序的调用部分传递给它的信息,然后回到单个值。音信通过称为参数的特殊标志符传递给函数,然后通过RETUPRADON语句重返。

陆. 创设函数

MySQL数据库的积攒进度,MySQL存款和储蓄进程的创导及调用。语法:

CREATE [ OR REPLACE ] FUNCTION [ schema. ] function_name
  [ ( parameter_declaration [, parameter_declaration]... ) 
  ]
  RETURN datatype
  [ { invoker_rights_clause
    | DETERMINISTIC
    | parallel_enable_clause
    | RESULT_CACHE  [ relies_on_clause ]
    }...
  ]
  { { AGGREGATE | PIPELINED }  USING [ schema. ] implementation_type
  | [ PIPELINED ] { IS | AS } { [ declare_section ] body 
                              | call_spec
                              | EXTERNAL
                              }
  } ;

缅甸新锦江赌场网址,示例1:

CREATE FUNCTION get_bal(acc_no IN NUMBER) 
   RETURN NUMBER 
   IS
     acc_bal NUMBER(11,2);
   BEGIN 
      SELECT order_total INTO acc_bal FROM orders 
      WHERE customer_id = acc_no; 
      RETURN(acc_bal); 
    END;

函数参数也可以有输入、输出、输入输出二种形式:IN、OUT、IN OUT是形参的格局。若省略,则为IN情势。

和进度一样,IN格局的形参只可以将实参传递给形参,进入函数内部,但不得不读不可能写,函数再次回到时实参的值不改变。

OUT方式的形参加会议忽略调用时的实参值(或说该形参的初步值总是NULL),但在函数内部能够被读或写,函数重返时形参的值会赋予给实参。

IN OUT具有前三种形式的性状,即调用时,实参的值总是传递给形参,停止时,形参的值传递给实参。

调用时,对于IN形式的实参可以是常量或变量,但对此OUT和IN OUT形式的实参必须是变量。

示例2:

CREATE OR REPLACE FUNCTION get_salary(
  dept_no IN NUMBER DEFAULT 1,
  emp_count OUT NUMBER)
  RETURN NUMBER
IS
  V_sum NUMBER;
BEGIN
  SELECT SUM(SALARY), count(*) INTO V_sum, emp_count FROM EMPLOYEES
  WHERE DEPARTMENT_ID=dept_no;
  RETURN v_sum;
EXCEPTION
   WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('数据不存在');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('其它异常:');
      DBMS_OUTPUT.PUT_LINE('错误号:' || SQLCODE||',错误消息:'||SQLERRM);
END get_salary;

七. 函数调用

语法:

function_name([[parameter_name1 =>] value1[, [parameter_name2 =>] value2, ...]]);

示例1:

DECLARE
  v_num NUMBER;
  v_sum NUMBER;
BEGIN
  v_sum := get_salary(27, v_num);
  DBMS_OUTPUT.PUT_LINE('部门27的工资总和:'||v_sum||',人数为:'||v_num);
END;

示例2:

DECLARE
  v_num NUMBER;
  v_sum NUMBER;
BEGIN
  v_sum := get_salary(dept_no => 27, emp_count => v_num);
  DBMS_OUTPUT.PUT_LINE('部门27的工资总和:'||v_sum||',人数为:'||v_num);
END;

示例3:

DECLARE
  v_num NUMBER;
  v_sum NUMBER;
BEGIN
  v_sum := get_salary(emp_count => v_num);
  DBMS_OUTPUT.PUT_LINE('部门27的工资总和:'||v_sum||',人数为:'||v_num);
END;

8. 去除进程或函数

删去进程语法:

DROP PROCEDURE [schema.]procudure_name;

剔除函数语法:

DROP FUNCTION [schema.]function_name;

九. 经过与函数比较

过程 函数
作为PL/SQL语句执行 作为表达式的一部分执行
在规范中不包含RETURN子句 必须在规范中包含RETURN子句
不返回任何值 必须返回单个值
可以RETURN语句,但是与函数不同,它不能用于返回值 必须包含至少一条RETURN语句

进度与函数的1致效果有:

  1. 都应用IN形式的参数字传送入数据、OUT方式的参数再次回到数据。
  2. 输入参数都足以承受默许值,都足以传值或传辅导。
  3. 调用时的实际参数都能够选用位置表示法、名称表示法或结成措施。
  4. 都有扬言部分、实践部分和那二个管理局地。
  5. 其管理进度都有开创、编译、授权、删除、显示注重关系等。

 

二)、-- 传入学生序号,获取展现该学生的真名

缅甸新锦江赌场,1、in输入参数

 

2、调用存款和储蓄进度:call sp_name[(传参)];

 

  >存款和储蓄进程体包蕴了在经过调用时务必推行的语句,比方:dml、ddl语句,if-then-else和while-do语句、注解变量的declare语句等

 

BEGIN
  BEGIN
    BEGIN
      statements; 
    END
  END
END
 -- 调用无参存储过程
CALL testprint();

-- 调用有参数的存储过程
set @stuid = 1;
SET @subid = 1;
CALL mytest(@stuid,@subid);    

三、存款和储蓄进度体

 1 delimiter $$ 
 2 DROP PROCEDURE IF EXISTS getstuname;
 3 CREATE PROCEDURE getstuname(in sid INT,out stuname VARCHAR(100))
 4 BEGIN
 5 SELECT student.sname into stuname FROM student WHERE student.sid = sid;
 6 END;
 7 $$
 8 delimiter;
 9 
10 set @stuid = 2;
11 CALL getstuname(@stuid,@stuname);
12 SELECT @stuid as sid,@stuname AS stuname;

注意:

1、存款和储蓄进程
壹、定义:壹组可编制程序的函数,是为了做到一定功效的SQL语句集,经编写翻译成立并保存在数据库中,用户可经过点名存款和储蓄进程的名字并加以参数(必要时)来调用试行

  在概念进程时,使用DELIMITE冠道$$ 命令将讲话的实现符号从分号 ; 有时改为七个$$,使得进程体中应用的子公司被一直传送到服务器,而不会被客户端(如mysql)解释。

陆、存款和储蓄进度的参数
存储进程能够有0个或几个参数,用于存款和储蓄进程的概念。
三种参数类型:
   IN输入参数:表示调用者向经过传入值(传入值能够是字面量或变量)
   OUT输出参数:表示经过向调用者传出值(能够回去八个值)(传出值只可以是变量)
   INOUT输入输出参数:既意味着调用者向进度传入值,又代表经过向调用者传出值(值只好是变量)
提议:>输入值使用in参数;
>再次来到值使用out参数;
>inout参数就玩命的少用。
例子:
一)、传入学生和科目id ,得到该学员该科目标大成

1、存款和储蓄进度的开创和调用

 1 delimiter $$ 
 2 DROP PROCEDURE IF EXISTS mytest;
 3 CREATE PROCEDURE mytest(in sid INT,in suid INT)
 4 BEGIN
 5 UPDATE score SET score.scscore=scscore+5 
 6 WHERE score.sid = sid AND score.suid = suid;
 7 END;
 8 $$
 9 delimiter;
10 
11 set @stuid = 1;
12 SET @subid = 1;
13 CALL mytest(@stuid,@subid);
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);
+---------+
| p_inout |
+---------+
|       1 |
+---------+

+---------+
| p_inout |
+---------+
|       2 |
+---------+

mysql> select @p_inout;
+----------+
| @p_inout |
+----------+
|        2 |
+----------+

三、>存储进度固然有着名字的壹段代码,用来造成八个特定的成效。
   >创制的囤积进程保存在数据库的多少字典中。

  叁联合接口,确认保障数量的安全

四、基本创设格式

label1: BEGIN
  label2: BEGIN
    label3: BEGIN
      statements; 
    END label3 ;
  END label2;
END label1
1 delimiter//    -- 将SQL语句的结束标记设置为//
2 DROP PROCEDURE IF EXISTS testprint; -- 如果存在该名字的存储过程则删除
3 CREATE PROCEDURE testprint() -- 创建一个名字为testprint的存储过程,    -- 括号里面可以传参数:CREATE PROCEDURE mytest(in sid INT,in suid INT)
4 BEGIN    -- 代码部分开始
5 SELECT '你好,成都' as infos; -- 存储过程的代码部分
6 END;    -- 代码部分结束
7 //    -- 结束标记
8 delimiter; -- 编写编译结束后将SQL语句的结束标记还原

    例:CREATE PROCEDURE sp_name ([proc_parameter[,...]]) ……

二、优点:壹将重复性非常高的片段操作,封装到3个储存进程中,简化了对那个SQL的调用
           二批量拍卖:SQL+循环,减弱流量,也正是“跑批”
      叁统1接口,确认保障数量的平安

 

  一增进代码的可读性

#调用了inout_param存款和储蓄进程,接受了输入的参数,也出口参数,改造了变量

mysql> create database db1;
mysql> use db1;    
mysql> create table PLAYERS as select * from TENNIS.PLAYERS;
mysql> create table MATCHES  as select * from TENNIS.MATCHES;

#创立数据库,备份数据表用于示例操作

  在存款和储蓄进度中安装了急需传参的变量p_playerno,调用存款和储蓄进度的时候,通过传参将57赋值给p_playerno,然后实行仓库储存进度里的SQL操作。

  2批量管理:SQL+循环,减弱流量,也正是“跑批”

墙裂提出:

  >存款和储蓄进程纵然所知名字的壹段代码,用来完毕3个特定的法力。

 

首页 | 关于我们 | 产品中心  | 新闻中心 | 资质认证  | 下载中心 | 在线留言  | 联系我们
Copyright © 2014 缅甸新锦江赌场-官方网站缅甸新锦江 Rights Reserved.  技术支持:温州中网   备案号:浙ICP备14009337号-1  

Baidu
sogou