【问题标题】:Oracle Stored Procedure not loading data as expectedOracle 存储过程未按预期加载数据
【发布时间】:2019-11-14 19:32:30
【问题描述】:

在测试中,我做了以下(有效):

create table testdata as select * from sometable;

create procedure testload as begin
delete from testdata;
insert into testdata select * from sometable;
end;

我对更复杂的查询使用了相同的结构。如果我运行“insert into testdata select [new query]”,它会将数据加载到表中。但是,当我使用新查询创建新的存储过程时,它会执行,但不会实际加载数据。

请注意,这个查询是交给我的,不是我自己写的。结果已经过验证,因此虽然我很欣赏有关如何清理代码的任何和所有建议,但我主要感兴趣的是启动存储过程并使用尽可能接近以下内容的代码运行。

select 
CLAIM_ID
,INTERNAL_ID
,line
,VENDOR_GROUP 
,case when (CLAIM_FORMAT_RULE+ POS_RULE + POS_TYPE_RULE+ POS_CODE_RULE+ MODIFIERS_RULE+ BILL_TYPE_RULE+ ATTENDING_PROV_RULE+ REFERRING_PROV_RULE) = 8 then 'Y' else 'N' end AUTH_FLAG
from 
(
SELECT         
AP.CLAIM_ID
,CLM1.INTERNAL_ID
, px.line
, DAT.VENDOR_GROUP

,MAX(CASE WHEN DAT.FORMAT_C IS NULL THEN 1  WHEN REPLACE(REPLACE(AP.CLAIM_FORMAT_C,1,'CMS'),2,'UB') = UPPER(DAT.FORMAT_C) THEN 1 else 0 END) AS CLAIM_FORMAT_RULE     
,MAX(CASE WHEN DAT.POS_ID IS NULL THEN 1  WHEN EAF.INTERNAL_ID = DAT.POS_ID THEN 1  else 0 end ) AS POS_RULE        
,MAX(CASE WHEN DAT.POS_TYPE_C IS NULL THEN 1 WHEN NVL(PX.POS_TYPE_C,0) NOT IN (20,23) THEN 1 WHEN CAST(PX.POS_TYPE_C AS VARCHAR(10)) = DAT.POS_TYPE_C THEN 1 else 0 END) AS POS_TYPE_RULE               
,MAX(CASE WHEN DAT.PROC_CODE IS NULL THEN 1 WHEN DAT.PROC_CODE LIKE '%-%' AND EAP.PROC_CODE BETWEEN STRTOK(DAT.PROC_CODE,'-',1) AND STRTOK(DAT.PROC_CODE,'-',2) THEN 1 WHEN EAP.PROC_CODE = DAT.PROC_CODE THEN 1 else 0 END) AS POS_CODE_RULE             
,MAX(CASE WHEN DAT.MODIFIER IS NULL THEN 1 WHEN DAT.MODIFIER = PX.MODIFIERS THEN 1 else 0 END)  AS MODIFIERS_RULE              
,MAX(CASE WHEN DAT.BILL_TYPE IS NULL THEN 1 WHEN DAT.BILL_TYPE LIKE '%-%' AND AP.TYPE_OF_BILL BETWEEN STRTOK(DAT.BILL_TYPE,'-',1) AND STRTOK(DAT.BILL_TYPE,'-',2) THEN 1 WHEN AP.TYPE_OF_BILL = DAT.BILL_TYPE THEN 1 else 0 END)  AS BILL_TYPE_RULE               
,MAX(CASE WHEN DAT.ATTENDING_PROV_NETWORK IS NULL THEN 1 WHEN DAT.ATTENDING_PROV_NETWORK = ALV.NET_AFFIL_LEVEL_C THEN 1 else 0  END)  AS ATTENDING_PROV_RULE              
,MAX(CASE WHEN DAT.REFERRING_PROV_NETWORK IS NULL THEN 1 WHEN DAT.REFERRING_PROV_NETWORK = RLV.NET_AFFIL_LEVEL_C THEN 1 else 0 END)  AS REFERRING_PROV_RULE               

FROM HCCLSC.AP_CLAIM AP       
INNER JOIN HCCLSC.CLM_MAP CLM1 ON AP.CLAIM_ID=CLM1.CID --AND CLM1.INTERNAL_ID in ('363137412',  '363149130')
INNER JOIN HCCLSC.CLARITY_VENDOR VEN ON AP.VENDOR_ID = VEN.VENDOR_ID             
INNER JOIN HCCLSC.VENDOR_TAX_ID VTIN ON AP.VENDOR_ID = VTIN.VENDOR_ID            
INNER JOIN KPBISC_GRP_NCAR.AUTH_EXCEPTIONS DAT ON VTIN.TAX_ID = DAT.VENDOR_TIN               
LEFT JOIN HCCLSC.AP_CLAIM_PX PX ON AP.CLAIM_ID = PX.CLAIM_ID       
LEFT JOIN HCCLSC.CLARITY_EAP EAP ON EAP.PROC_ID = PX.PROC_ID        
LEFT JOIN HCCLSC.EAF_MAP EAF ON AP.LOC_ID = EAF.CID             
LEFT JOIN HCCLSC.CLARITY_SER_NETAFF ALV ON AP.ATTEND_PROV_ID = ALV.PROV_ID AND ALV.LINE = 1       
LEFT JOIN HCCLSC.CLARITY_SER_NETAFF RLV ON AP.REF_PROV_ID = RLV.PROV_ID AND ALV.LINE = 1       

where   
TRUNC(AP.DATE_RECEIVED) BETWEEN sysdate-60 AND sysdate and

COALESCE(AP.WORKFLOW_C,0)=0   
and  AP.STATUS_C in (2, 4, 3)

GROUP BY AP.CLAIM_ID,CLM1.INTERNAL_ID, px.line,  DAT.VENDOR_GROUP

order by AP.CLAIM_ID    , px.line
)

【问题讨论】:

  • 我知道这听起来很简单,但是您是否在运行代码的同一会话中检查结果?您在问题中输入的匿名块中没有 COMMIT 语句。如果您从不同的会话进行检查(某些 IDE 为每个窗口创建一个新会话),您将看不到新插入的记录。
  • @del 这不是小事。我从不同的选项卡运行,但添加提交不起作用。尝试将提交添加到 proc 本身的末尾以及在执行 proc 时(begin proc; commit; end;),没有骰子。

标签: sql oracle stored-procedures


【解决方案1】:

如果不是其他答案中提到的提交问题,请尝试自行运行选择语句,但将整个语句包装在 select count(*) from (your_statement);

这将告诉您查询是否返回零行。

【讨论】:

  • 返回大约 143k 条记录,所以它不是加载 0 条记录。我担心它与提交有关,但我尝试将提交添加到存储过程定义以及执行时,但似乎都不起作用。但是,只需运行“插入表 [select 语句]”就可以了。我错过了一些东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 2012-09-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多