• sql sever 常用的存储过程的写法或者说与Oracle中存过的异同点


    1.ORACLE 

    create or replace procedure proc_test (v_pat_no     in     varchar2,
                                                                   cv_1        out    sys_refcursor) as
    v_patient_id varchar2(12);
    v_times number;
    tempsize number;
    begin

    select count(1) into tempsize
    from zy_actpatient
    where inpatient_no = v_pat_no
    and substr(patient_id, 12, 1) = '0'
    and nvl(visit_type, '0') <> 'XX';

    if tempsize >0  then
              select patient_id, admiss_times
              into v_patient_id, v_times
               from zy_actpatient
               where inpatient_no = v_pat_no;
    else
            select '',''into v_patient_id, v_times from dual;
    end if;

         open cv_1 for

        select       a.*    from a   ;
    end;

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

    2. sql sever 版本

    create   procedure    proc_test_a
    @v_pat_no varchar(20)
    as
    declare

    @v_patient_id varchar(12),
    @v_times float,
    @tempsize float
    begin
    select @tempsize =count(1)
    from zy_actpatient
    where inpatient_no = @v_pat_no
    and substring(patient_id, 12, 1) = '0'
    and isnull(visit_type, '0') <> 'XX'

    if @tempsize >0
    select @v_patient_id = patient_id, @v_times=admiss_times from zy_actpatient where inpatient_no = @v_pat_no
    and substring(patient_id, 12, 1) = '0' and isnull(visit_type, '0') <> 'XX'
    else
    select @v_patient_id='',@v_times=''

     select       a.* from a   where  a.admiss_times = @v_times

    end

    从上面的1与2可以得到Oracle与sql sever写存过的区别是::

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

    3.Oracle

    create or replace procedure p_hld(v_ward in varchar2,
                                                           cv_1 out sys_refcursor)

    as

    begin
    insert into hld_general_1 (enc_id,hlcg)
    select enc_id,DISPLAY_NAME
    from general_order
    where serial = '**' and DISPLAY_NAME like '%护理常规%' and order_status in ('2','3','4') and input_type = 'd'
    and ward_sn = v_ward;

    insert into hld_general_1 (enc_id,fjhl)
    select enc_id,DISPLAY_NAME
    from general_order
    where serial = '**' and DISPLAY_NAME like '%级护理%' and order_status in ('2','3','4') and input_type = 'd'
    and ward_sn = v_ward;

    open cv_1 for
    select distinct b.bed_no,b.name, enc_id,

    (select to_char(wm_concat(hlcg)) From hld_general_1 b where b.enc_id = a.enc_id) hlcg ,
    (select to_char(wm_concat(fjhl)) From hld_general_1 b where b.enc_id = a.enc_id) fjhl,
    (select name from zd_unit_code where code =v_ward) 科室
    from hld_general_1 a,cisdb_dev.patient_encounter b
    where b.code = 'inp' and b.status_code = 'active'
    and b.ward = v_ward
    and a.enc_id = b.patient_encounter_id
    order by b.bed_no;

    delete hld_general_1;
    end;

     从这个图片可以看到上面insert的结果,主要是用了一个distinct就把数据显示在一起了。


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

    4.0  sql  sever 

    CREATE procedure [dbo].[p_hld](@ward varchar(7))

    as

    begin
    insert into hld_general_1 (enc_id,hlcg)
    select enc_id,display_name
    from general_order
    where serial = '**' and display_name like '%护理常规%' and order_status in ('2','3','4') and input_type = 'd'
    and stop_time is null and ward_sn = @ward;

    insert into hld_general_1 (enc_id,fjhl)
    select enc_id,display_name
    from general_order
    where serial = '**' and display_name like '%级护理%' and order_status in ('2','3','4') and input_type = 'd'
    and stop_time is null and ward_sn = @ward;

    insert into hld_general_1 (enc_id,ys)
    select enc_id,display_name
    from general_order where serial = '**' and display_name like '%饮食%' and order_status in ('2','3','4') and input_type = 'd'
    and stop_time is null and ward_sn = @ward;

    insert into hld_general_1 (enc_id,jh)
    select enc_id,display_name + freq_code as display_name from general_order
    where code in ('516245','500381','500382','516330','516317','516251') and order_status in ('2','3','4')
    and stop_time is null and ward_sn = @ward;

    insert into hld_general_1 (enc_id,xy)
    select enc_id,display_name from general_order where serial = '**' and (display_name like '%吸氧%' or display_name like '%氧气%' )and order_status in ('2','3','4') and input_type = 'd'
    and stop_time is null and ward_sn = @ward;

    insert into hld_general_1 (enc_id,qt)
    select enc_id, display_name from general_order where code not in ('516245','500381','500382','516330','516246','999999','516090','516251','516317') and serial = '**' and display_name not like '%护理常规%'
    and display_name not like '%级护理%' and display_name not like '%饮食%' and display_name not like '%吸氧%' and order_type not in('1', '2')
    and order_status in ('2','3','4') and input_type = 'd'
    and stop_time is null and ward_sn = @ward;


    select distinct b.bed_no,b.name, enc_id,
    ( STUFF(( SELECT ',' + hlcg FROM hld_general_1 hlcg WHERE hlcg.enc_id = a.enc_id FOR XML PATH('') ), 1, 1, '') ) hlcg ,
    ( STUFF(( SELECT ',' + fjhl FROM hld_general_1 fjhl WHERE fjhl.enc_id = a.enc_id FOR XML PATH('') ), 1, 1, '') ) fjhl,
    ( STUFF(( SELECT ',' + ys FROM hld_general_1 ys WHERE ys.enc_id = a.enc_id FOR XML PATH('') ), 1, 1, '') ) ys,
    ( STUFF(( SELECT ',' + jh FROM hld_general_1 jh WHERE jh.enc_id = a.enc_id FOR XML PATH('') ), 1, 1, '') ) jh,
    ( STUFF(( SELECT ',' + xy FROM hld_general_1 xy WHERE xy.enc_id = a.enc_id FOR XML PATH('') ), 1, 1, '') ) xy,
    ( STUFF(( SELECT ',' + qt FROM hld_general_1 qt WHERE qt.enc_id = a.enc_id FOR XML PATH('') ), 1, 1, '') ) qt,
    (select name from zd_unit_code where code =@ward) 科室
    from hld_general_1 a,cisdb_dev.dbo.patient_encounter b
    where b.code = 'inp' and b.status_code = 'active'
    and b.ward = @ward
    and a.enc_id = b.patient_encounter_id
    order by b.bed_no;

    -- select name INTO @warnname from zd_unit_code where code =@ward;


    delete hld_general_1;
    -- commit;
    end;


    GO

    上面的主要提出的知识点:

    1.往临时表里面写数据,而且还是分次写入用到语句是

    insert into hld_general_1 (enc_id,hlcg)

    select enc_id,DISPLAY_NAME from general_order 

    where DISPLAY_NAME like '%护理常规%' 

    下面的表后面跟上字段,代表往这个表的具体哪个字段写入数据

    hld_general_1 (enc_id,hlcg)

  • 相关阅读:
    DBSCAN 聚类分析
    常见空间聚类算法优劣概述
    最佳实践 —— 单元测试
    C/C++ 混合编程
    映射网络路径
    时间服务器/时间同步配置
    取出根路径
    PS Studio调用.exe输出错误信息的解决办法
    远程重启IIS服务
    浏览打开窗口,打开运行窗口,文件夹
  • 原文地址:https://www.cnblogs.com/thomasbc/p/12469165.html
Copyright © 2020-2023  润新知