数据库大神请进,求助一句SQL
简单的说就是不存在即插入,存在即修改的问题。数据库表如下:user_IDuser_nameuser_status当传入一个user_id时,如果表里已经存在了,就把对应的...
简单的说就是不存在即插入,存在即修改的问题。数据库表如下:
user_ID user_name user_status
当传入一个user_id时,如果表里已经存在了,就把对应的user_status设置成1,如果user_id不存在,就插入这一条数据。
是oracle数据库,求sql语句,效率要高一点的。 展开
user_ID user_name user_status
当传入一个user_id时,如果表里已经存在了,就把对应的user_status设置成1,如果user_id不存在,就插入这一条数据。
是oracle数据库,求sql语句,效率要高一点的。 展开
4个回答
展开全部
最近写过一个类似的例子,跟你要求的几乎一样,你可以参考一下结构和思想,改一下表什么的就行,希望对你有帮助:
创建存储过程:P_UPDATE_ST_HACHUJ_ALL_G
输入参数:P$PO_DT date型
输出参数:P$RET number型
存储过程具体的操作
首先获取采购日期 (P$PO_DT)当月的采购信息(ST_HACHUJ_ALL)。
然后将取得的数据插入ST_HACHUJ_ALL_G表中 或者 更新 ST_HACHUJ_ALL_G表
(PO_NO在ST_HACHUJ_ALL_G中不存在,数据插入ST_HACHUJ_ALL_G,SEQ值= 0;
PO_NO在ST_HACHUJ_ALL_G中存在,更新ST_HACHUJ_ALL_G,SEQ值+ 1)。
CREATE OR REPLACE PROCEDURE P_UPDATE_ST_HACHUJ_ALL_G2
(P$PO_DT IN DATE,P$RET OUT NUMBER)
AS
V$CGXX ST_HACHUJ_ALL% ROWTYPE;
V$PO_NO NUMBER( 10);
CURSOR CUR_A
IS
SELECT T1.*
FROM ST_HACHUJ_ALL T1
WHERE TO_CHAR(T1.PO_DT,'YYYYMM' )=TO_CHAR(P$PO_DT,'YYYYMM');
BEGIN
P$RET:=0;
OPEN CUR_A;
LOOP
FETCH CUR_A INTO V$CGXX;
EXIT WHEN CUR_A%NOTFOUND;
SELECT COUNT (*)INTO V$PO_NO FROM ST_HACHUJ_ALL_G WHERE PO_NO=V$CGXX.PO_NO;
IF V$PO_NO>0 THEN
UPDATE ST_HACHUJ_ALL_G SET CO_CD=V$CGXX.CO_CD,REV=V$CGXX.REV,SPPL_CD=V$CGXX.SPPL_CD,PSPPL_CD=V$CGXX.PSPPL_CD,PO_DT=V$CGXX.PO_DT,LAST_DLV_DT=V$CGXX.LAST_DLV_DT,
PURC_DPT_CD=V$CGXX.PURC_DPT_CD,PURC_USR_CD=V$CGXX.PURC_USR_CD,PO_SHET_ISSU_COMPL_FLG=V$CGXX.PO_SHET_ISSU_COMPL_FLG,SCST_SHET_ISSU_COMPL_FLG=V$CGXX.SCST_SHET_ISSU_COMPL_FLG,ABR_PO_FLG=V$CGXX.ABR_PO_FLG,
INCTRMS_CD=V$CGXX.INCTRMS_CD,UKEBASHO_CD=V$CGXX.UKEBASHO_CD,PAY_COND_CD=V$CGXX.PAY_COND_CD,CUR_CD=V$CGXX.CUR_CD,XCNTRCT_FLG=V$CGXX.XCNTRCT_FLG,XRATE_DT=V$CGXX.XRATE_DT,XRATE=V$CGXX.XRATE,XCNTRCT_NO=V$CGXX.XCNTRCT_NO,
NOT_BILL_ACC_FLG=V$CGXX.NOT_BILL_ACC_FLG,TRD_TYP=V$CGXX.TRD_TYP,SUBCON_FLG=V$CGXX.SUBCON_FLG,PAY_COMPL_FLG=V$CGXX.PAY_COMPL_FLG,PAY_DT=V$CGXX.PAY_DT,IV_TGT_FLG=V$CGXX.IV_TGT_FLG,RMRKS=V$CGXX.RMRKS,APPROVAL_FLG=V$CGXX.APPROVAL_FLG,
APPROVAL_NO=V$CGXX.APPROVAL_NO,APPROVAL_SEQ=V$CGXX.APPROVAL_SEQ,APRV_TYP=V$CGXX.APRV_TYP,LAST_APV_USR_ID=V$CGXX.LAST_APV_USR_ID,APV_ABSTRACT=V$CGXX.APV_ABSTRACT,NEXT_OPR_FLG=V$CGXX.NEXT_OPR_FLG,PO_SHET_NO=V$CGXX.PO_SHET_NO,
INS_TS=V$CGXX.INS_TS,INS_USR_CD=V$CGXX.INS_USR_CD,UPD_CNTR=V$CGXX.UPD_CNTR,UPD_TS=V$CGXX.UPD_TS,UPD_USR_CD=V$CGXX.UPD_USR_CD,SEQ=SEQ+ 1
WHERE PO_NO=V$CGXX.PO_NO;
ELSE
INSERT INTO ST_HACHUJ_ALL_G (PO_NO,CO_CD,REV,SPPL_CD,PSPPL_CD,PO_DT,LAST_DLV_DT,PURC_DPT_CD,PURC_USR_CD,PO_SHET_ISSU_COMPL_FLG,SCST_SHET_ISSU_COMPL_FLG,ABR_PO_FLG,
INCTRMS_CD,UKEBASHO_CD,PAY_COND_CD,CUR_CD,XCNTRCT_FLG,XRATE_DT,XRATE,XCNTRCT_NO,NOT_BILL_ACC_FLG,TRD_TYP,SUBCON_FLG,
PAY_COMPL_FLG,PAY_DT,IV_TGT_FLG,RMRKS,APPROVAL_FLG,APPROVAL_NO,APPROVAL_SEQ,APRV_TYP,LAST_APV_USR_ID,APV_ABSTRACT,NEXT_OPR_FLG,
PO_SHET_NO,INS_TS,INS_USR_CD,UPD_CNTR,UPD_TS,UPD_USR_CD,SEQ)
VALUES (V$CGXX.PO_NO,V$CGXX.CO_CD,V$CGXX.REV,V$CGXX.SPPL_CD,V$CGXX.PSPPL_CD,V$CGXX.PO_DT,V$CGXX.LAST_DLV_DT,V$CGXX.PURC_DPT_CD,
V$CGXX.PURC_USR_CD,V$CGXX.PO_SHET_ISSU_COMPL_FLG,V$CGXX.SCST_SHET_ISSU_COMPL_FLG,V$CGXX.ABR_PO_FLG,V$CGXX.INCTRMS_CD,V$CGXX.UKEBASHO_CD,V$CGXX.PAY_COND_CD,
V$CGXX.CUR_CD,V$CGXX.XCNTRCT_FLG,V$CGXX.XRATE_DT,V$CGXX.XRATE,V$CGXX.XCNTRCT_NO,V$CGXX.NOT_BILL_ACC_FLG,V$CGXX.TRD_TYP,
V$CGXX.SUBCON_FLG,V$CGXX.PAY_COMPL_FLG,V$CGXX.PAY_DT,V$CGXX.IV_TGT_FLG,V$CGXX.RMRKS,V$CGXX.APPROVAL_FLG,V$CGXX.APPROVAL_NO,
V$CGXX.APPROVAL_SEQ,V$CGXX.APRV_TYP,V$CGXX.LAST_APV_USR_ID,V$CGXX.APV_ABSTRACT,V$CGXX.NEXT_OPR_FLG,V$CGXX.PO_SHET_NO,
V$CGXX.INS_TS,V$CGXX.INS_USR_CD,V$CGXX.UPD_CNTR,V$CGXX.UPD_TS,V$CGXX.UPD_USR_CD,0 );
END IF ;
END LOOP ;
CLOSE CUR_A;
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE( '无值');
ROLLBACK;
WHEN OTHERS THEN
P$RET:= SQLCODE;
ROLLBACK;
END;
创建存储过程:P_UPDATE_ST_HACHUJ_ALL_G
输入参数:P$PO_DT date型
输出参数:P$RET number型
存储过程具体的操作
首先获取采购日期 (P$PO_DT)当月的采购信息(ST_HACHUJ_ALL)。
然后将取得的数据插入ST_HACHUJ_ALL_G表中 或者 更新 ST_HACHUJ_ALL_G表
(PO_NO在ST_HACHUJ_ALL_G中不存在,数据插入ST_HACHUJ_ALL_G,SEQ值= 0;
PO_NO在ST_HACHUJ_ALL_G中存在,更新ST_HACHUJ_ALL_G,SEQ值+ 1)。
CREATE OR REPLACE PROCEDURE P_UPDATE_ST_HACHUJ_ALL_G2
(P$PO_DT IN DATE,P$RET OUT NUMBER)
AS
V$CGXX ST_HACHUJ_ALL% ROWTYPE;
V$PO_NO NUMBER( 10);
CURSOR CUR_A
IS
SELECT T1.*
FROM ST_HACHUJ_ALL T1
WHERE TO_CHAR(T1.PO_DT,'YYYYMM' )=TO_CHAR(P$PO_DT,'YYYYMM');
BEGIN
P$RET:=0;
OPEN CUR_A;
LOOP
FETCH CUR_A INTO V$CGXX;
EXIT WHEN CUR_A%NOTFOUND;
SELECT COUNT (*)INTO V$PO_NO FROM ST_HACHUJ_ALL_G WHERE PO_NO=V$CGXX.PO_NO;
IF V$PO_NO>0 THEN
UPDATE ST_HACHUJ_ALL_G SET CO_CD=V$CGXX.CO_CD,REV=V$CGXX.REV,SPPL_CD=V$CGXX.SPPL_CD,PSPPL_CD=V$CGXX.PSPPL_CD,PO_DT=V$CGXX.PO_DT,LAST_DLV_DT=V$CGXX.LAST_DLV_DT,
PURC_DPT_CD=V$CGXX.PURC_DPT_CD,PURC_USR_CD=V$CGXX.PURC_USR_CD,PO_SHET_ISSU_COMPL_FLG=V$CGXX.PO_SHET_ISSU_COMPL_FLG,SCST_SHET_ISSU_COMPL_FLG=V$CGXX.SCST_SHET_ISSU_COMPL_FLG,ABR_PO_FLG=V$CGXX.ABR_PO_FLG,
INCTRMS_CD=V$CGXX.INCTRMS_CD,UKEBASHO_CD=V$CGXX.UKEBASHO_CD,PAY_COND_CD=V$CGXX.PAY_COND_CD,CUR_CD=V$CGXX.CUR_CD,XCNTRCT_FLG=V$CGXX.XCNTRCT_FLG,XRATE_DT=V$CGXX.XRATE_DT,XRATE=V$CGXX.XRATE,XCNTRCT_NO=V$CGXX.XCNTRCT_NO,
NOT_BILL_ACC_FLG=V$CGXX.NOT_BILL_ACC_FLG,TRD_TYP=V$CGXX.TRD_TYP,SUBCON_FLG=V$CGXX.SUBCON_FLG,PAY_COMPL_FLG=V$CGXX.PAY_COMPL_FLG,PAY_DT=V$CGXX.PAY_DT,IV_TGT_FLG=V$CGXX.IV_TGT_FLG,RMRKS=V$CGXX.RMRKS,APPROVAL_FLG=V$CGXX.APPROVAL_FLG,
APPROVAL_NO=V$CGXX.APPROVAL_NO,APPROVAL_SEQ=V$CGXX.APPROVAL_SEQ,APRV_TYP=V$CGXX.APRV_TYP,LAST_APV_USR_ID=V$CGXX.LAST_APV_USR_ID,APV_ABSTRACT=V$CGXX.APV_ABSTRACT,NEXT_OPR_FLG=V$CGXX.NEXT_OPR_FLG,PO_SHET_NO=V$CGXX.PO_SHET_NO,
INS_TS=V$CGXX.INS_TS,INS_USR_CD=V$CGXX.INS_USR_CD,UPD_CNTR=V$CGXX.UPD_CNTR,UPD_TS=V$CGXX.UPD_TS,UPD_USR_CD=V$CGXX.UPD_USR_CD,SEQ=SEQ+ 1
WHERE PO_NO=V$CGXX.PO_NO;
ELSE
INSERT INTO ST_HACHUJ_ALL_G (PO_NO,CO_CD,REV,SPPL_CD,PSPPL_CD,PO_DT,LAST_DLV_DT,PURC_DPT_CD,PURC_USR_CD,PO_SHET_ISSU_COMPL_FLG,SCST_SHET_ISSU_COMPL_FLG,ABR_PO_FLG,
INCTRMS_CD,UKEBASHO_CD,PAY_COND_CD,CUR_CD,XCNTRCT_FLG,XRATE_DT,XRATE,XCNTRCT_NO,NOT_BILL_ACC_FLG,TRD_TYP,SUBCON_FLG,
PAY_COMPL_FLG,PAY_DT,IV_TGT_FLG,RMRKS,APPROVAL_FLG,APPROVAL_NO,APPROVAL_SEQ,APRV_TYP,LAST_APV_USR_ID,APV_ABSTRACT,NEXT_OPR_FLG,
PO_SHET_NO,INS_TS,INS_USR_CD,UPD_CNTR,UPD_TS,UPD_USR_CD,SEQ)
VALUES (V$CGXX.PO_NO,V$CGXX.CO_CD,V$CGXX.REV,V$CGXX.SPPL_CD,V$CGXX.PSPPL_CD,V$CGXX.PO_DT,V$CGXX.LAST_DLV_DT,V$CGXX.PURC_DPT_CD,
V$CGXX.PURC_USR_CD,V$CGXX.PO_SHET_ISSU_COMPL_FLG,V$CGXX.SCST_SHET_ISSU_COMPL_FLG,V$CGXX.ABR_PO_FLG,V$CGXX.INCTRMS_CD,V$CGXX.UKEBASHO_CD,V$CGXX.PAY_COND_CD,
V$CGXX.CUR_CD,V$CGXX.XCNTRCT_FLG,V$CGXX.XRATE_DT,V$CGXX.XRATE,V$CGXX.XCNTRCT_NO,V$CGXX.NOT_BILL_ACC_FLG,V$CGXX.TRD_TYP,
V$CGXX.SUBCON_FLG,V$CGXX.PAY_COMPL_FLG,V$CGXX.PAY_DT,V$CGXX.IV_TGT_FLG,V$CGXX.RMRKS,V$CGXX.APPROVAL_FLG,V$CGXX.APPROVAL_NO,
V$CGXX.APPROVAL_SEQ,V$CGXX.APRV_TYP,V$CGXX.LAST_APV_USR_ID,V$CGXX.APV_ABSTRACT,V$CGXX.NEXT_OPR_FLG,V$CGXX.PO_SHET_NO,
V$CGXX.INS_TS,V$CGXX.INS_USR_CD,V$CGXX.UPD_CNTR,V$CGXX.UPD_TS,V$CGXX.UPD_USR_CD,0 );
END IF ;
END LOOP ;
CLOSE CUR_A;
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE( '无值');
ROLLBACK;
WHEN OTHERS THEN
P$RET:= SQLCODE;
ROLLBACK;
END;
美林数据技术股份有限公司
2023-07-25 广告
2023-07-25 广告
常用的大数据工具有以下这些:* Apache Cassandra:一种分布式的开源数据库。* Apache Drill:一种开源分布式系统,用于大规模数据集的交互分析。* Apache Elasticsearch:是Apache Lucen...
点击进入详情页
本回答由美林数据技术股份有限公司提供
展开全部
用merge,应该能实现,你可以百度一下,不知道你的传入的user_id从哪来的,不好写sql语句。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这要写存储过程的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询