sql语句汇总

这篇博客汇总了SQL的各种常用语句,包括函数(如拼接、截取)、字符串处理、转换函数、分组查询、循环语句、条件判断等,适用于SQLServer、MySQL和Oracle等数据库。通过实例展示了如何使用这些语句进行数据操作,对于数据库开发者和管理员非常有帮助。

https://www.cnblogs.com/accumulater/p/6088980.html--普通SQL语句可以用Exec执行

https://blog.csdn.net/qq_36482772/article/details/77815021--自定义带输入参数的存储过程

默认的SQLServer

''附近有错误,把空格都去了重新空,

一,函数

1,拼接函数

SELECT'123'+'123'AS result1;

使用 cast

select '+' cast(2 as varchar)

第二种方法:

select (stuff((select '+' + nNum from table for xml path ('')),1,1,''))   //nNum是 int类型

使用 RTRIM

select (stuff((select '+' + RTRIM(nNum) from table for xml path ('')),1,1,''))   //nNum是 int类型

MySQL的:

SELECT CONCAT(123,'123')AS result1; ---- 123123

SELECT CONCAT_WS(':','abc','def')AS result1; ------ ABC:DEF

 

--------------------- --------------------- -------- ------------- --------------------- 

根据某字段分组拼接

shop_id fruit_name 
    1桃子 
    1梨子 
    2香蕉 
    3苹果 
    2草莓 

从shop_id中选择t_fruit group中的shop_id,GROUP_CONCAT(fruit_name);

--------------------- --------------------- -------- ------------- --------------------- 

SQLServer的:不同数据类型拼接要处理 - 数字与字符串拼接

从用户中选择'id_'+ convert(varchar(50),id)

2,截取字符串

离开(pid,17)

对(pid,1)

SUBSTRING(pid,1,17)

3,CONVERT()函数是把日期转换为新数据类型的通用函数

把20181108改成 - > 2018-11-08 CONVERT(varchar(10),CONVERT(datetime,zzrq,10),23)

--update xxcw..cbm set zzrq = CONVERT(varchar(10),CONVERT(datetime,zzrq,10),23)

其中bmh(从RES_projects中选择zw_prjcode)和zzrq <>''和zzrq不像'% - %'

如图4所示,不以字母开头的数据

select * from saap_users where user_id like '[^A-Zz-z]%'

5、去左右空格

select ltrim(rtrim(UsrName))

6、exists用法

select * from res_projects a where exists(select rp_code from aky b where a.rp_code = b.部门号) and a.rp_status is null

数据库里面就算有一列数据不相等都不能用exists判断是否存在,select查出相等列来判断exists也不奏效,这种情况要用in

7、in 用法

表1把相等用来判断同一条数据的那几列查出来,作为条件拼接not in表2,表2将这些列拼接

例:select * from (select id, name, pid from table1) a

       where  (convert(varchar(50), a.id)+ convert(varchar(50), a.name)+ convert(varchar(50), a.pid)) not in

       (select (convert(varchar(50), id)+ convert(varchar(50), name)+ convert(varchar(50), pid)) from table2) 
8、group by分组,用于去重,查询列要和group by保持一致

9、case when

        CASE c.continue_flag WHEN 0 THEN '项目延续' WHEN 1 THEN '新增项目' WHEN 2 THEN '项目延续' ELSE null END as '项目类型'

10、循环语句

declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
end

---------------

while 条件
begin
执行操作
set @i=@i+1
end

WHILE

11、左侧自动补零

例如 ‘49999’ 五位 自动补零 ‘0049999’
      ‘1000000’七位不变 ‘1000000’
请问怎么实现?

--> 查询结果

SELECT right('000000'+cast(id as varchar),7) as id

12、添加自然序号 从1开始递增

a.通过rownum实现即可。
sql:select rownum , * from tablename where 条件语句。

b.Row_Number()over(order by ID)

 

实例:

insert into 
    BGT_projects (fp_code,fp_type,fp_name,dpt_code,fp_status,dpt_name) 
SELECT 
    '20191225'+ cast(right('00'+cast(Row_Number()over(order by user_id) as varchar),2) as varchar),1,'部门预算项目(二上)',depart_code,0,depart_name 
FROM 
    SAAP_users 
WHERE 
    SEX = 'D'

13、去空格

select ltrim('  test  ')        --去除左边的空格 
select rtrim('  test  ')        --去除右边的空格 
select ltrim(rtrim('  test  ')) --去除首尾空格 

14、分页    currentPage 第几页   pageSize 每页数据条数

mysql:limit m,n     【m:开始位置 (不包含当前位置,或者理解为从0开始)----  n:从开始位置开始一共取多少条

limit (currentPage-1)*pageSize,pageSize

SqlServer:            【@Star:开始位置(不包含当前位置,或者理解为从0开始)-----   @End:结束位置(含当前位置)

DECLARE @Start INT
DECLARE @End INT
SELECT @Start = (currentPage-1)*pageSize,@End = currentPage*pageSize;
WITH EmployeePage AS (SELECT *, ROW_NUMBER() OVER (ORDER BY user_id) AS RowNumber FROM Emp)
SELECT * FROM EmployeePage WHERE RowNumber > @Start AND RowNumber <= @End ORDER BY user_id
https://www.cnblogs.com/ebread/p/SQLServer.html

15、合并数据并去重(同一张表)

select * from dcms_danger_gas where cas_no = '1333-74-0'
UNION
SELECT * FROM dcms_danger_gas where  '1氢气1' like CONCAT(CONCAT('%',item_name),'%') 

详解:union会根据所有列来判断是否重复,只要有一列数据不一样就判断不为重复。只有列名个数、次序、名字完全一样才可以使用union合并。

mysql没有全外连接,可以使用  (左连接 union 右连接)达到全外连接的作用。下面是一个例子,题目是攻击出销售经理每天摆放的CPM客户数和非CPM客户数并在一行显示,结果列:日期,销售经理,CPM客户数,非CPM客户数

CREATE TABLE `table_test` (
  `拜访时间` date DEFAULT NULL,
  `销售经理` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `客户类型` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- ----------------------------
-- Records of table_test
-- ----------------------------
INSERT INTO `table_test` VALUES ('2017-05-31', '张林', '非CPM客户');
INSERT INTO `table_test` VALUES ('2017-06-06', '姚红伟', 'CPM客户');
INSERT INTO `table_test` VALUES ('2017-08-11', '张林', 'CPM客户');
INSERT INTO `table_test` VALUES ('2017-08-11', '姚红伟', 'CPM客户');
INSERT INTO `table_test` VALUES ('2017-08-11', '姚红伟', 'CPM客户');
INSERT INTO `table_test` VALUES ('2017-08-11', '牛双旗', 'CPM客户');
INSERT INTO `table_test` VALUES ('2017-08-13', '张林', '非CPM客户');
INSERT INTO `table_test` VALUES ('2017-08-14', '姚红伟', 'CPM客户');
INSERT INTO `table_test` VALUES ('2017-08-17', '张林', 'CPM客户');
INSERT INTO `table_test` VALUES ('2017-08-28', '姚红伟', 'CPM客户');
INSERT INTO `table_test` VALUES ('2017-08-28', '姚红伟', 'CPM客户');
INSERT INTO `table_test` VALUES ('2017-08-28', '姚红伟', 'CPM客户');
INSERT INTO `table_test` VALUES ('2017-09-11', '马义华', 'CPM客户');
INSERT INTO `table_test` VALUES ('2017-09-11', '胡伟', 'CPM客户');
INSERT INTO `table_test` VALUES ('2017-09-19', '牟小东', '非CPM客户');
INSERT INTO `table_test` VALUES ('2017-09-21', '马义华', 'CPM客户');
INSERT INTO `table_test` VALUES ('2017-05-31', '张林', 'CPM客户');
INSERT INTO `table_test` VALUES ('2017-09-22', '胡伟', '非CPM客户');

SELECT 拜访CPM客户次数,拜访非CPM客户次数,a.拜访时间,a.销售经理 from
(select COUNT(拜访时间) 拜访CPM客户次数,拜访时间,销售经理,客户类型 from table_test where 客户类型='CPM客户' group by 拜访时间,销售经理,客户类型)a
left JOIN (select COUNT(拜访时间) 拜访非CPM客户次数,拜访时间,销售经理,客户类型 from table_test where 客户类型='非CPM客户' group by 拜访时间,销售经理,客户类型)b
on a.拜访时间=b.拜访时间 and a.销售经理 = b.销售经理
union
SELECT 拜访CPM客户次数,拜访非CPM客户次数,b.拜访时间,b.销售经理 from
(select COUNT(拜访时间) 拜访CPM客户次数,拜访时间,销售经理,客户类型 from table_test where 客户类型='CPM客户' group by 拜访时间,销售经理,客户类型)a
RIGHT JOIN (select COUNT(拜访时间) 拜访非CPM客户次数,拜访时间,销售经理,客户类型 from table_test where 客户类型='非CPM客户' group by 拜访时间,销售经理,客户类型)b
on a.拜访时间=b.拜访时间 and a.销售经理 = b.销售经理

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

go
create procedure query_page
    @currentPage INT,
    @pageSize INT
as
    DECLARE @Start INT
    DECLARE @End INT
    SELECT @Start = @currentPage,@End = @pageSize;
    SELECT @currentPage = (@Start-1)*@End,@pageSize = @Start*@End
    WITH EmployeePage AS (SELECT *, ROW_NUMBER() OVER (ORDER BY user_id) AS RowNumber FROM Emp)
    SELECT * FROM EmployeePage WHERE RowNumber > @currentPage AND RowNumber <= @pageSize ORDER BY user_id

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

go
create procedure query_page2
    @currentPage INT,
    @pageSize INT
as
begin
    DECLARE @Start INT
    DECLARE @End INT
    SELECT @Start = @currentPage,@End = @pageSize;
    SELECT @currentPage = (@Start-1)*@End,@pageSize = @Start*@End
    WITH EmployeePage AS (SELECT *, ROW_NUMBER() OVER (ORDER BY user_id) AS RowNumber FROM Emp)
    SELECT * FROM EmployeePage WHERE RowNumber > @currentPage AND RowNumber <= @pageSize ORDER BY user_id
end

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

16、oracle插入多条数据:

INSERT ALL 
INTO DCMS_DANGER_GAS(CAS_NO, ITEM_NAME) VALUES('7784-42-1','砷化氢')
INTO DCMS_DANGER_GAS(CAS_NO, ITEM_NAME) VALUES('25167-67-3' ,'丁烯')
INTO DCMS_DANGER_GAS(CAS_NO, ITEM_NAME) VALUES('106-99-0' ,'丁二烯')
INTO DCMS_DANGER_GAS(CAS_NO, ITEM_NAME) VALUES('865758-36-7' ,'氯化甲烷')
SELECT 1 FROM DUAL;

 

INSERT INTO TPP_IVT_AST.SYS_USER_FUND(F_USERID, VC_FUNDCODE) 
SELECT 661,'200165' FROM DUAL 
       UNION ALL 
SELECT 661,'200009' FROM DUAL 
       UNION ALL 
SELECT 661,'200025' FROM DUAL 
       UNION ALL 
SELECT 661,'200253' FROM DUAL
       UNION ALL 
SELECT 661,'200448' FROM DUAL 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

17、查询某库、所有表的字段注释

select TABLE_NAME 表名,COLUMN_NAME 列名, DATA_TYPE 字段类型, COLUMN_COMMENT 字段注释 
from information_schema.`COLUMNS` 
where TABLE_SCHEMA='uthinkcloud_prod' and  TABLE_NAME in (select TABLE_NAME from information_schema.`COLUMNS` where TABLE_SCHEMA='uthinkcloud_prod' and COLUMN_COMMENT <> '')

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

二、删除完全重复数据

1.根据去重数据建立新表:select distinct * into temTable from xxcw..cbmfx where bmh in ('YF20180052')

2.删除旧表数据。

3.将新表数据插回到旧表。

 

三、查看表结构

sp_helptext:显示规则、默认值、未加密的存储过程用户定义函数触发器或视图的文本。

sp_help:报告有关数据库对象(sysobjects 表中列出的任何对象)、用户定义数据类型或 Microsoft® SQL Server™ 所提供的数据类型的信息。

注:用sp_help可以查看主键的index_name,例:PK__SAAP_user__id,用于删除主键时使用。删除主键不是删除列名,是删除index_name。

sp_columns:可以用这个一次性获取所有列名,不用一个个手输,查看所有列的相关信息,大小

sp_tables :查看当前是表还是视图

--查询某字段类型
SELECT * FROM user_tab_cols   A where  A.column_name   =  'ST_REGION';

--查询某表所有列   只有 表名、列明、comments字段
select * from user_col_comments t where t.table_name = 'DCMS_LAB_ITEMS';

--查询某表所有列,表名必须大写
SELECT * FROM all_tab_columns  A where  A.table_name  = 'DCMS_LAB_ITEMS';
--查询某表所有主键列
select   *   from   user_cons_columns   
    where   table_name   =   'DCMS_LAB_ITEMS'   
        and   constraint_name   in (          select   constraint_name   from   user_constraints   
    where   table_name   =   'DCMS_LAB_ITEMS'   
        and   constraint_type   ='P'   )
        

四、更新数据

1、向表中插入另一张表的数据

insert into

    表名1 (列名)

select

    列名

from

    表名2

where

    条件

-----------------------------------------------------------------------------------------------------

2、根据某表数据修改另一张表的数据

update 
    users 
set 
    dept_code = d.dept_code 
from 
    departs d, users u 
where 
    d.dept_code = u.dept_code

五、根据源数据创建视图或表

创建视图:CREATE view 视图名 as select * from 表名
创建新表:select * into 表名 from 旧表

                  create table table2 as select * from table1;

视图依附表创建

 

2、oracle根据excel导入数据到某表

a、excel文档只留下需要导入的字段,不需要留列名。以CSV格式保存

b、新建文本文档,保存格式为ctl,例如:input.ctl,dcms_registered_labs_wan是导入到哪个表

load data
infile 'C:\Users\33189\Desktop\test.csv' 
append into table dcms_registered_labs_wan fields terminated by ','
trailing nullcols(lab_name)

c、cmd运行input.ctl

->sqlldr userid=hxp_wechart/yuan@192.168.1.194:1521/orcl control=C:\Users\33189\Desktop\input.ctl

六、修改表

修改字段类型:
alter table tableName alter column columnName varchar(n)

添加字段:
alter table tableName add columnName varchar(n)

添加多个字段:

alter table tableName add columnName numeric(3) default 0, 
                                          columnName2 char(10),
                                          columnName3 char(1) default    '0'
删除字段:
alter table tableName drop column columnName

删除约束:

alter table tableName drop constraint constraintName

DF开头是默认值约束,对象'DF__BGT_categ__round__5F3414E9' 依赖于 列'round_nocur'。

alter table BGT_category drop constraint DF__BGT_categ__round__5F3414E9

 

--自增列不能直接修改,必须将原有ID列删除,然后重新添加一列具有identity属性的ID字段。

--删除主键
alter table EMP drop constraint PK__EMP__B9BE370F76577163

--修改列类型
alter table EMP alter column user_id int not null;
alter table EMP alter column sex varchar(2)

--设置主键
alter table EMP add primary key(user_id);


--删除列
alter table EMP drop column user_id

--添加自动增长列
alter table EMP add user_id int IDENTITY(1,1) NOT NULL

--设置字段为当前时间
alter table EMP add birthday smalldatetime default getdate();

--修改列名
EXEC sp_rename 'EMP.birthday', 'registerTime', 'COLUMN';

--修改表名
EXEC sp_rename '原有表名', '新表名';

 

七、SQL插入数据区分大小写,查询不区分大小写

从表中选择名称,其中name ='abc'collat​​e Chinese_PRC_CS_AI_WS

从表中选择名称Chinese_PRC_CS_AI_WS ='abc'整理的名称
 

八、表连接

内连接:=包括其中的重复列

等值连接:inner join不包括重复列

外连接:left join,right join一表数据作为基准

 

九、存储过程

mysql:

create procedure query_top10()
begin
    select top 10 * from emp;
end;

调用:call query_top10();

sqlserver:

go
create proc query_top10 as
begin
    select top 10 * from emp;
end;

调用:exec query_top10;

但是jdbc里面还是写call

CallableStatement cs = DBConnection.getConn().prepareCall("{call query_top10}");

CallableStatement cs = DBConnection.getConn().prepareCall("{call query_page(?,?)}");

ORACLE:

https://www.cnblogs.com/Marydon20170307/p/9567493.html--变量声明和赋值的三种方式

https://blog.csdn.net/zhou920786312/article/details/72670049--存储过程+调用存储过程+无/带参的存储过程+in参数+out参数+int out参数+为参数设置默认值

赋值,在begin之前。变量:=和 select XX into 变量两种赋值方法

例:

1.select count(ST_ID) into V_OUT_DATA_NUM from DCMS_LAB_STORAGE

2.

as

V_ITEM_CODE CHAR(16) := '123';

V_ITEM_CODE CHAR(16) := 'select item_code from table where id = 1';

begin

循环 游标

as

  --定义游标,在调用的时候执行,所以在调用游标之前的sql语句会先执行
  CURSOR itemData IS  SELECT lab_code, st_id, item_code, item_form, stock_limit, stock_current, item_name, catalog from DCMS_lab_items where lab_code = V_IN_LAB_CODE and st_id in (select ST_ID from DCMS_del_lab_storage where LAB_CODE = V_IN_LAB_CODE and ST_REGION = V_IN_ST_REGION and ST_BUILDING = V_IN_ST_BUILDING and ST_ROOMNO = V_IN_ST_ROOM);--查询已删除房间的各化学品存量

调用游标:

begin

--循环开始
        LOOP
          IF NOT itemData%ISOPEN  THEN
             OPEN itemData;
          END IF; 

          --将循环查询的数据赋值给变量,fetch需要跟查询列保持一致
          FETCH itemData INTO  V_LAB_CODE, V_ST_ID, V_ITEM_CODE, V_ITEM_FORM, V_STOCK_LIMIT, V_STOCK_CURRENT,V_ITEM_NAME, V_CATALOG;
          --退出循环的条件
          EXIT WHEN itemData%NOTFOUND OR itemData%NOTFOUND IS NULL;

       END LOOP;

IF ELSE:

if()
begin
  ...
end
else if()
begin
  ...
end
else
begin
  ...
end

 

IF (V_ITEM_NUM > 0) THEN
            dbms_output.put_line('存在' || '--房间号' ||  V_OUT_ST_ID_MIN);
            update DCMS_lab_items set stock_current = stock_current + V_STOCK_CURRENT where lab_code = V_LAB_CODE and st_id = V_OUT_ST_ID_MIN and item_code = V_ITEM_CODE and item_form = V_ITEM_FORM;
            delete from DCMS_lab_items where lab_code = V_LAB_CODE and st_id = V_ST_ID and item_code = V_ITEM_CODE and item_form = V_ITEM_FORM;
         ELSE
             dbms_output.put_line('不存在' || '--房间号' || V_OUT_ST_ID_MIN );
             update DCMS_lab_items set st_id = V_OUT_ST_ID_MIN where lab_code = V_LAB_CODE and st_id = V_ST_ID and item_code = V_ITEM_CODE and item_form = V_ITEM_FORM;
          END IF;

 

-----------------创建存储过程
CREATE OR REPLACE PROCEDURE deleteRepeatData(
  --输入参数
  V_IN_LAB_CODE          in CHAR,  --实验室code--入参在调用的时候给大小
  V_IN_ST_REGION       in VARCHAR2,  --校区
  V_IN_ST_BUILDING  in VARCHAR2,  --楼宇                                   
  V_IN_ST_ROOM      in VARCHAR2,  --楼层及房间号
  --设置返回值
  V_OUT_DATA_NUM    out numeric,  --返回重复数据条数--输出参数不能再声明的时候赋值
  V_OUT_ST_ID_MIN   out numeric   --返回结果最小的st_id
)
AS
   V_LAB_CODE CHAR(6);--声明变量需要给大小
   V_ST_ID NUMBER(22);
   V_ITEM_CODE CHAR(16);
   V_ITEM_FORM CHAR(1);
   V_STOCK_LIMIT NUMBER(22);
   V_STOCK_CURRENT NUMBER(22);
   V_ITEM_NAME VARCHAR2(500);
   V_CATALOG CHAR(10);
   V_ITEM_NUM NUMBER(22);
  --定义游标,在调用的时候执行,所以在调用游标之前的sql语句会先执行
  CURSOR itemData IS
  --查询已删除房间的化学品存量
  SELECT lab_code, st_id, item_code, item_form, stock_limit, stock_current, item_name, catalog from DCMS_lab_items where lab_code = V_IN_LAB_CODE and st_id in (select ST_ID from DCMS_del_lab_storage where LAB_CODE = V_IN_LAB_CODE and ST_REGION = V_IN_ST_REGION and ST_BUILDING = V_IN_ST_BUILDING and ST_ROOMNO = V_IN_ST_ROOM);
BEGIN
--查询房间个数
select count(ST_ID) into V_OUT_DATA_NUM from DCMS_LAB_STORAGE where LAB_CODE = V_IN_LAB_CODE and ST_REGION = V_IN_ST_REGION and ST_BUILDING = V_IN_ST_BUILDING and ST_ROOMNO = V_IN_ST_ROOM;
       --如果有重复列执行以下sql
       IF (V_OUT_DATA_NUM > 1) THEN 
         --查询st_id最小一列的值
         select min(ST_ID) into V_OUT_ST_ID_MIN from DCMS_LAB_STORAGE where LAB_CODE = V_IN_LAB_CODE and ST_REGION = V_IN_ST_REGION and ST_BUILDING = V_IN_ST_BUILDING and ST_ROOMNO = V_IN_ST_ROOM;
         --将需要删除的列保存到新表中
         insert into DCMS_del_lab_storage(lab_code, st_id,st_region,St_Building,st_roomno) select lab_code, st_id,st_region,St_Building,st_roomno from DCMS_LAB_STORAGE where st_id <> V_OUT_ST_ID_MIN and LAB_CODE = V_IN_LAB_CODE and ST_REGION = V_IN_ST_REGION and ST_BUILDING = V_IN_ST_BUILDING and ST_ROOMNO = V_IN_ST_ROOM;
         --删除多余条数并保存st_id最小的那一条
         delete from DCMS_LAB_STORAGE where st_id <> V_OUT_ST_ID_MIN and LAB_CODE = V_IN_LAB_CODE and ST_REGION = V_IN_ST_REGION and ST_BUILDING = V_IN_ST_BUILDING and ST_ROOMNO = V_IN_ST_ROOM;
         --修改订单表st_id=min(st_id)
         update dcms_orders set st_id = V_OUT_ST_ID_MIN where lab_code = V_IN_LAB_CODE and st_id in (select ST_ID from DCMS_del_lab_storage where LAB_CODE = V_IN_LAB_CODE and ST_REGION = V_IN_ST_REGION and ST_BUILDING = V_IN_ST_BUILDING and ST_ROOMNO = V_IN_ST_ROOM);
         --修改订单表st_id=min(st_id)
         update dcms_register set st_id = V_OUT_ST_ID_MIN where lab_code = V_IN_LAB_CODE and st_id in (select ST_ID from DCMS_del_lab_storage where LAB_CODE = V_IN_LAB_CODE and ST_REGION = V_IN_ST_REGION and ST_BUILDING = V_IN_ST_BUILDING and ST_ROOMNO = V_IN_ST_ROOM);
         --修改订单表st_id=min(st_id)
         update dcms_history set st_id = V_OUT_ST_ID_MIN where lab_code = V_IN_LAB_CODE and st_id in (select ST_ID from DCMS_del_lab_storage where LAB_CODE = V_IN_LAB_CODE and ST_REGION = V_IN_ST_REGION and ST_BUILDING = V_IN_ST_BUILDING and ST_ROOMNO = V_IN_ST_ROOM);
       --循环开始
        LOOP
          IF NOT itemData%ISOPEN  THEN
             OPEN itemData;
          END IF; 
          FETCH itemData INTO  V_LAB_CODE, V_ST_ID, V_ITEM_CODE, V_ITEM_FORM, V_STOCK_LIMIT, V_STOCK_CURRENT,V_ITEM_NAME, V_CATALOG;
          --退出循环的条件
          EXIT WHEN itemData%NOTFOUND OR itemData%NOTFOUND IS NULL;
          V_ITEM_NUM := 0;
          dbms_output.put_line('编号' || V_LAB_CODE || '--房间号' || V_ST_ID );
          --检查循环是否进来
          --insert into table_test (lab_code, st_id, item_code, item_form, stock_limit, stock_current,item_name,catalog) values(V_LAB_CODE, V_ST_ID, V_ITEM_CODE, V_ITEM_FORM, V_STOCK_LIMIT, V_STOCK_CURRENT,V_ITEM_NAME, V_CATALOG);   
          select count(lab_code) into V_ITEM_NUM from DCMS_lab_items where lab_code = V_LAB_CODE and st_id = V_OUT_ST_ID_MIN and item_code = V_ITEM_CODE and item_form = V_ITEM_FORM;
          --判断当前化学品在min(st_id)房间里面有没有,有的话就update存量再delete掉重复房间的数据,没有的话直接update
          IF (V_ITEM_NUM > 0) THEN
            dbms_output.put_line('存在' || '--房间号' ||  V_OUT_ST_ID_MIN);--输出区
            update DCMS_lab_items set stock_current = stock_current + V_STOCK_CURRENT where lab_code = V_LAB_CODE and st_id = V_OUT_ST_ID_MIN and item_code = V_ITEM_CODE and item_form = V_ITEM_FORM;
            delete from DCMS_lab_items where lab_code = V_LAB_CODE and st_id = V_ST_ID and item_code = V_ITEM_CODE and item_form = V_ITEM_FORM;
         ELSE
             dbms_output.put_line('不存在' || '--房间号' || V_OUT_ST_ID_MIN );
             update DCMS_lab_items set st_id = V_OUT_ST_ID_MIN where lab_code = V_LAB_CODE and st_id = V_ST_ID and item_code = V_ITEM_CODE and item_form = V_ITEM_FORM;
          END IF;
        END LOOP;
END IF;
END deleteRepeatData;
-----------------调用存储过程
declare 
        V_IN_LAB_CODE CHAR(6) ; --实验室code
      V_IN_ST_REGION VARCHAR2(20) ; --校区
      V_IN_ST_BUILDING VARCHAR2(20) ; --楼宇
      V_IN_ST_ROOM VARCHAR2(20) ; --所在楼层及房间号
        V_OUT_DATA_NUM numeric; --数据条数
      V_OUT_ST_ID_MIN numeric; --最小存放地点序号
    BEGIN
        DBMS_OUTPUT.ENABLE(buffer_size => null) ; --设置缓存大小
        V_IN_LAB_CODE := '002166'; --赋值
        V_IN_ST_REGION := '邯郸校区'; --赋值
        V_IN_ST_BUILDING := '10号楼'; --赋值
        V_IN_ST_ROOM := '12'; --赋值
        deleteRepeatData(V_IN_LAB_CODE,V_IN_ST_REGION,V_IN_ST_BUILDING,V_IN_ST_ROOM,V_OUT_DATA_NUM,V_OUT_ST_ID_MIN); --调用存储过程,GET_QUESTIONNAIRE_CONTENT 为存储过程的名字
        dbms_output.put_line(V_OUT_DATA_NUM); --输出结果
      dbms_output.put_line(V_OUT_ST_ID_MIN); --输出结果
    end;
 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

带入参存储过程

go
create procedure query_page
    @currentPage INT,
    @pageSize INT
as
    DECLARE @Start INT
    DECLARE @End INT
    SELECT @Start = @currentPage,@End = @pageSize;
    SELECT @currentPage = (@Start-1)*@End,@pageSize = @Start*@End
    WITH EmployeePage AS (SELECT *, ROW_NUMBER() OVER (ORDER BY user_id) AS RowNumber FROM Emp)
    SELECT * FROM EmployeePage WHERE RowNumber > @currentPage AND RowNumber <= @pageSize ORDER BY user_id

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

go
create procedure query_page2
    @currentPage INT,
    @pageSize INT
as
begin
    DECLARE @Start INT
    DECLARE @End INT
    SELECT @Start = @currentPage,@End = @pageSize;
    SELECT @currentPage = (@Start-1)*@End,@pageSize = @Start*@End
    WITH EmployeePage AS (SELECT *, ROW_NUMBER() OVER (ORDER BY user_id) AS RowNumber FROM Emp)
    SELECT * FROM EmployeePage WHERE RowNumber > @currentPage AND RowNumber <= @pageSize ORDER BY user_id
end

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

--执行带参存储过程
exec query_page2 2,10;
--查询存储过程
SELECT * FROM SYSOBJECTS ORDER BY REFDATE DESC
IF EXISTS(SELECT * FROM SYSOBJECTS WHERE NAME = 'query_top3' OR NAME = 'query_top5')
--删除存储过程
DROP PROCEDURE query_page2

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

mybatis中,IF 、CASE WHEN的用法,还有sql语句块的用法

<sql id="column">
        F_ACTIONID            as actionid
        ,F_ACTIONPID         as actionpid
        ,VC_PIN                as vcpid
        ,VC_ACTIONNAME            as vcactionname
        ,VC_ACTIONCODE            as vcactioncode
        ,VC_URL                as vcurl
        ,VC_ICON                as vcicon
        ,trim(VC_ACTIONTYPE)         as vcactiontype
        ,IF(VC_STATUS='0', '启用','禁用')                as vcstatus
        ,VC_REMARK                as vcremark
        ,IF(VC_MODEL='0', '内部链接','外部链接')                as vcmodel
        ,CASE WHEN VC_GROUP = '0' THEN '本系统'
              WHEN VC_GROUP = '1' THEN 'fof'
              WHEN VC_GROUP = '2' THEN 'biee'
              ELSE 'risk' END as vcgroup
        ,F_ACTIONID            as id
        ,F_ACTIONPID         as pId
        ,VC_ACTIONNAME         as name
        ,VC_ICON             as iconClass
        ,VC_TEAM             as vcteam
    </sql>
    <select id="selectList" parameterType="com.datadriver.web.menu.dto.MenuDto" resultType="com.datadriver.web.menu.model.Menu">
        select
        <include refid="column"></include>
        from sys_action
        where 1=1 
        order by VC_PIN
    </select>
    <select id="findByDto" parameterType="com.datadriver.web.menu.dto.MenuDto" resultType="com.datadriver.web.menu.model.Menu">
        select
        <include refid="column"/>
        from SYS_ACTION
        where 1=1
        <if test="actionid!=null and actionid !='' ">
            and F_ACTIONID = #{actionid}
        </if>
    </select>

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

mybatis中新增selectKey语句块,生成一个动态变量,供后面的语句使用

<insert id="insertEdimType" parameterType="com.datadriver.web.edim.model.Edims" >
   <selectKey resultType="java.lang.String" order="BEFORE" keyProperty="dimType">
      select count(*)+1 as dimType from e_dim_conf a
   </selectKey>
   insert into e_dim_conf 
      <trim prefix="(" suffix=")" suffixOverrides="," >
         <if test="dimTypename != null and dimTypename !='' " >
            dim_type,
            dim_typename,
         </if>
         
       </trim>
       <trim prefix="values (" suffix=")" suffixOverrides="," >
         <if test="dimTypename != null and dimTypename !='' " >
            #{dimType},
            #{dimTypename},
         </if>
       </trim>
</insert>

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值