ORACLE鏈接SQLSERVER數據庫數據操作函數范例
create or replace function FUN_NAME(LS_DJBH IN varchar2 ,LS_ITM varchar2 ,LS_Type int) return varchar2 as
PRAGMA AUTONOMOUS_TRANSACTION;--有DML操作必須添加,如增刪改查
/* 名稱:FUN_NAME 參數:LS_DJBH 單據編號,LS_ITM 項次,LS_Type 操作類型 作用:LS_Type 為1 時同步生產日工單數據至ttt系統的任務單,LS_Type 為2 時取消ttt系統中同步的日工單數據 版本:V0001 V0001 修改人:博客燕,修改日期:20191010,修改內容:創建函數 */ LS_ORDERID varchar2(200); --訂單編號 LS_JH_DD varchar2(200); --計划日期 LS_MAX_TaskMasterOID INT; -- Task_Main表主鍵ID LS_OrderAID varchar2(200);--訂單編號 LS_ReceiveDateOID INT; --計划日期轉換為int后為接單日期 LS_MAX_TaskDetailOID INT;--Task_Detail表主鍵ID LS_ProductOID INT;--產品ID LS_PRD_NO varchar2(200); --產品編號 LS_QTY INT;--數量 LS_Output varchar2(200);--返回值 LS_PDID INT;--用於判斷 LS_PJ VARCHAR(200); --拼接字符串 begin LS_PJ:=NVL(LS_DJBH,'')||'-'||NVL(LS_ITM,'');--必須提前拼接,Oracle和SQLSERVER拼接語法不一致導致報錯 if LS_Type=1 then LS_PDID:=0; SELECT nvl(MAX("TaskMasterOID"),0) into LS_PDID FROM SQL_TBMAIN@鏈接數據庫 WHERE "TaskAID"=LS_PJ; if LS_PDID=0 then --如果INET中已經存在相同單據號和項次的記錄,則不重新插入 SELECT to_char(JH_DD,'YYYY-MM-DD') INTO LS_JH_DD FROM ORACLE_TB_HEAD where DJBH=LS_DJBH; select NVL(max("TaskMasterOID"),0)+1 into LS_MAX_TaskMasterOID from SQL_TBMAIN@鏈接數據庫;--已存在的最大值+1 select (JH_DD-date'0001-01-01')-1 into LS_ReceiveDateOID from ORACLE_TB_HEAD where DJBH=LS_DJBH; --Oracle和SQLserver日期計算相差2,所以此處-1 SELECT ORDERID into LS_OrderAID FROM ORACLE_TB_DETAIL WHERE DJBH=LS_DJBH AND ITM=LS_ITM ; INSERT INTO dbo.SQL_TBMAIN@鏈接數據庫 ("TaskMasterOID" ,"TaskAID" ,"OrderAID" ,"ReceiveDateOID" ,"FinishStatus" ,"AssignStatus" ,"DataResource" ,"Remarks") VALUES (LS_MAX_TaskMasterOID,LS_PJ,LS_OrderAID,LS_ReceiveDateOID,0,0,0,'[ERP系統導入]'); COMMIT; SELECT PRD_NO into LS_PRD_NO FROM ORACLE_TB_DETAIL WHERE DJBH=LS_DJBH AND ITM=LS_ITM ; SELECT QTY_JH INTO LS_QTY FROM ORACLE_TB_DETAIL WHERE DJBH=LS_DJBH AND ITM=LS_ITM ; SELECT "OID" INTO LS_ProductOID FROM Product@INET where "AID"=LS_PRD_NO; INSERT INTO SQL_TBDetail@鏈接數據庫 ("TaskMasterOID" ,"TaskDetailItem" ,"ProductOID" ,"Quantity" ,"PreEndDateOID" ,"Remarks") VALUES(LS_MAX_TaskMasterOID,1,LS_ProductOID,LS_QTY,LS_ReceiveDateOID,'[ERP系統導入]'); COMMIT;--對鏈接的SQLSERVER和ORACLE之間必須提交,否則會提示:要求事務處理或保存點回退 update ORACLE_TB_DETAIL set INET_TB=1 where to_char(ITM)=LS_ITM AND DJBH=LS_DJBH; COMMIT; LS_Output:='同步成功!'; ELSE update ORACLE_TB_DETAIL set INET_TB=1 where to_char(ITM)=LS_DJBH AND DJBH=LS_DJBH; COMMIT; LS_Output:='項次:'||LS_ITM||' 已經存在同步記錄!'; END IF; ELSE select min("TaskMasterOID") into LS_MAX_TaskMasterOID from SQL_TBMAIN@鏈接數據庫 WHERE "TaskAID"=LS_PJ; LS_PDID:=0; SELECT nvl(MAX("TaskMasterOID"),0) into LS_PDID FROM SQL_TBMAIN@鏈接數據庫 WHERE nvl("AssignStatus",0)=1 and "TaskMasterOID"=LS_MAX_TaskMasterOID; IF LS_PDID>0 then LS_Output:='項次為:'||NVL(LS_ITM,'')||'的記錄在INET系統中已經確認,不能取消同步,請聯系車間人員取消確認!'; else delete from SQL_TBDetail@鏈接數據庫 where "TaskMasterOID"=LS_MAX_TaskMasterOID; delete from SQL_TBMAIN@鏈接數據庫 where "TaskMasterOID"=LS_MAX_TaskMasterOID; COMMIT;--對鏈接的SQLSERVER和ORACLE之間必須提交 update ORACLE_TB_DETAIL set INET_TB=0 where to_char(ITM)=LS_ITM AND DJBH=LS_DJBH; COMMIT;--對鏈接的SQLSERVER和ORACLE之間必須提交 LS_Output:='取消同步成功!'; end if ; END IF ; COMMIT; return LS_Output; end FUN_NAME;
Oralce 訪問鏈接的SQLSERVER 數據庫表時,如果在where 語句里用了 查詢作為條件則速度會非常慢,如下代碼用時 66秒,如果直接查詢 0.03 秒
SELECT * FROM ProductionLog@INET WHERE ROWNUM<10 and "BeginDateOID" = (select 737378-1 from dual)
ORDER BY "BeginDateOID" DESC;