立即执行:绑定变量不存在 &数据类型不一致



这就是块:

DECLARE CURSOR Cursore IS
SELECT DISTINCT CONF.SCHEMA, CONF.TABELLA, CONF.CAMPO, CONF.TIPO_CAMPO, CONF.LUNG_CAMPO, CONF.CAMPO_ACCESSO 
FROM EDWH.EDWH_GDPR_CONFIG CONF
WHERE UPPER(FLAG_CANC) = 'Y'
AND TABELLA = 'DWH_SIC_ANAGRAFICA_TEST'
ORDER BY CONF.TABELLA, CONF.CAMPO;    
C_SCHEMA EDWH_GDPR_CONFIG.SCHEMA%TYPE; 
C_TABELLA EDWH_GDPR_CONFIG.TABELLA%TYPE;
C_CAMPO EDWH_GDPR_CONFIG.CAMPO%TYPE;
C_TIPO_CAMPO EDWH_GDPR_CONFIG.TIPO_CAMPO%TYPE;
C_LUNG_CAMPO EDWH_GDPR_CONFIG.LUNG_CAMPO%TYPE;  
C_CAMPO_ACCESSO EDWH_GDPR_CONFIG.CAMPO_ACCESSO%TYPE;   
COMPARA_CHAR VARCHAR2(32);
COMPARA_VARCHAR VARCHAR2(32);
COMPARA_NUMBER VARCHAR2(32);
update_block VARCHAR2(1000);
BEGIN   
COMPARA_CHAR := 'CHAR';
COMPARA_VARCHAR := 'VARCHAR2';
COMPARA_NUMBER := 'NUMBER';
OPEN Cursore;
LOOP
FETCH Cursore INTO C_SCHEMA, C_TABELLA, C_CAMPO, C_TIPO_CAMPO, C_LUNG_CAMPO, C_CAMPO_ACCESSO;
update_block := 'UPDATE ' ||C_TABELLA||' SET '||C_CAMPO||' = 
CASE 
WHEN '''||C_TIPO_CAMPO||''' = '''||COMPARA_VARCHAR||''' AND '||C_LUNG_CAMPO||' < 4 THEN ''XX''
WHEN '''||C_TIPO_CAMPO||''' = '''||COMPARA_VARCHAR||''' AND '||C_LUNG_CAMPO||' > 4 THEN ''GDPR''
WHEN '''||C_TIPO_CAMPO||''' = '''||COMPARA_CHAR||''' AND '||C_LUNG_CAMPO||' < 4 THEN ''XX''
WHEN '''||C_TIPO_CAMPO||''' = '''||COMPARA_CHAR||''' AND '||C_LUNG_CAMPO||' >= 4 THEN ''GDPR''
WHEN '''||C_TIPO_CAMPO||''' = '''||COMPARA_NUMBER||''' THEN ''0''
ELSE (SELECT '||C_CAMPO||' FROM '||C_TABELLA||' WHERE '||C_CAMPO_ACCESSO||' = 199701360) 
END
WHERE '||C_CAMPO_ACCESSO||' = 199701360'; 
--dbms_output.put_line (update_block);  
EXECUTE IMMEDIATE update_block USING C_TABELLA, C_CAMPO, C_TIPO_CAMPO, C_LUNG_CAMPO, C_CAMPO_ACCESSO, COMPARA_VARCHAR, COMPARA_CHAR, COMPARA_NUMBER; 
EXIT WHEN Cursore%notfound;
END LOOP; 
CLOSE Cursore; 
END; 

这就是我从评论的 dbms_output.put_line 中得到的:

UPDATE DWH_SIC_ANAGRAFICA_TEST SET NUM_ISCRIZIONE_CCIAA = 
CASE 
WHEN 'NUMBER' = 'VARCHAR2' AND 22 < 4 THEN 'XX'
WHEN 'NUMBER' = 'VARCHAR2' AND 22 > 4 THEN 'GDPR'
WHEN 'NUMBER' = 'CHAR' AND 22 < 4 THEN 'XX'
WHEN 'NUMBER' = 'CHAR' AND 22 >= 4 THEN 'GDPR'
WHEN 'NUMBER' = 'NUMBER' THEN 'xxxx'
ELSE (SELECT NUM_ISCRIZIONE_CCIAA FROM DWH_SIC_ANAGRAFICA_TEST WHERE NDG = 199701360) 
END
WHERE NDG = 199701360

这里的此更新根本不起作用。不知道为什么... 我得到的错误是:ora-00932 不一致的数据类型预期字符得到数字 这似乎是一个明显的错误,但我找不到正确的解决方案来解决它。:/

遵循表的结构DWH_SIC_ANAGRAFICA_TEST

CREATE TABLE "EDWH"."DWH_SIC_ANAGRAFICA_TEST" 
(  
"COD_BANCA" VARCHAR2(4 CHAR), 
"DATA_RIFERIMENTO" DATE, 
"NDG" NUMBER(9,0), 
"COD_OPERAZIONE" VARCHAR2(18 CHAR), 
"COD_ABI" VARCHAR2(5 CHAR), 
"COD_FILIALE" VARCHAR2(5 CHAR), 
"COD_LEGAME" VARCHAR2(1 CHAR), 
"NDG_SOCIETA" NUMBER(9,0), 
"COD_LEGAME_SOCIETA" VARCHAR2(1 CHAR), 
"COD_TIPO_FINANZIATO_GARANTE" VARCHAR2(1 CHAR), 
"COD_FISCALE" VARCHAR2(16 CHAR), 
"FLG_COD_FISCALE_CALCOLATO" VARCHAR2(1 CHAR), 
"PARTITA_IVA" VARCHAR2(11 CHAR), 
"RAGIONE_SOCIALE" VARCHAR2(120 CHAR), 
"RAGIONE_SOCIALE_DITTA_INDIV" VARCHAR2(60 CHAR), 
"COGNOME_ACQUISITO" VARCHAR2(25 CHAR), 
"DESC_COMUNE_NASCITA" VARCHAR2(32 CHAR), 
"DATA_NASCITA" DATE, 
"SESSO" VARCHAR2(1 CHAR), 
"COD_TIPO_SOCIETA" VARCHAR2(4 CHAR), 
"COD_PROV_ISCRIZIONE_CCIAA" VARCHAR2(2 CHAR), 
"NUM_ISCRIZIONE_CCIAA" NUMBER(7,0), 
"FLG_CESSATA_ATTIVITA" VARCHAR2(1 CHAR), 
"COD_PROV_REGISTRO_SOC_TRIB" VARCHAR2(3 CHAR), 
"NUM_REGISTRO_SOC_TRIB" NUMBER(7,0), 
"NUM_ISCRIZ_ALBO_IMPRESE_ART" NUMBER(7,0), 
"COD_RAE" VARCHAR2(3 CHAR), 
"COD_SAE" VARCHAR2(3 CHAR), 
"COD_SOTTOCLASSIF_ATTIVITA" NUMBER(3,0), 
"INDIRIZZO_RESIDENZA" VARCHAR2(40 CHAR), 
"CAP_RESIDENZA" VARCHAR2(5 CHAR), 
"DESC_COMUNE_RESIDENZA" VARCHAR2(30 CHAR), 
"COD_PROV_RESIDENZA" VARCHAR2(2 CHAR), 
"COD_NAZIONE_RESIDENZA" VARCHAR2(3 CHAR), 
"NUM_TEL_RESIDENZA" VARCHAR2(16 CHAR), 
"INDIRIZZO_DOMICILIO" VARCHAR2(40 CHAR), 
"CAP_DOMICILIO" VARCHAR2(5 CHAR), 
"DESC_COMUNE_DOMICILIO" VARCHAR2(30 CHAR), 
"COD_PROV_DOMICILIO" VARCHAR2(2 CHAR), 
"COD_NAZIONE_DOMICILIO" VARCHAR2(3 CHAR), 
"NUM_TEL_DOMICILIO" VARCHAR2(16 CHAR), 
"FLG_ANAG_NUOVA_VARIATA" VARCHAR2(1 CHAR), 
"COD_ATECO" VARCHAR2(8 CHAR), 
"ANNO_RIF_COD_ATECO" NUMBER(4,0), 
"DATA_CONTABILE" DATE, 
"DATA_ESTRAZIONE" DATE, 
"DATA_INSERIMENTO" DATE, 
"DATA_ULTIMO_AGGIORNAMENTO" DATE
)

您的代码存在多个问题:

  • 您没有在update_block中使用绑定变量,并且仍在使用using块。您应该从execute immediate中删除using块。
EXECUTE IMMEDIATE update_block;
  • NUM_ISCRIZIONE_CCIAA列是number类型,并且您尝试使用具有所有varchar2类型的case when对其进行更新,而您的 else 块再次生成不一致的numberCase when必须产生相同的数据类型结果。

有关绑定变量的更多详细信息,请参阅此处。

干杯!!

你不使用任何绑定变量,它应该类似于这个(快速和肮脏(:

update_block := 'UPDATE ' ||C_TABELLA||' SET '||C_CAMPO||' = 
CASE 
WHEN :C_TIPO_CAMPO = :COMPARA_VARCHAR AND :C_LUNG_CAMPO < 4 THEN :XX
WHEN :C_TIPO_CAMPO = :COMPARA_VARCHAR AND :C_LUNG_CAMPO > 4 THEN :GDPR
WHEN :C_TIPO_CAMPO = :COMPARA_CHAR AND :C_LUNG_CAMPO < 4 THEN :XX
WHEN :C_TIPO_CAMPO = :COMPARA_CHAR AND :C_LUNG_CAMPO >= 4 THEN :GDPR
WHEN :C_TIPO_CAMPO = :COMPARA_NUMBER THEN 0
ELSE (SELECT '||C_CAMPO||' FROM '||C_TABELLA||' WHERE '||C_CAMPO_ACCESSO||' = 199701360) 
END
WHERE '||C_CAMPO_ACCESSO||' = 199701360'; 
--dbms_output.put_line (update_block);  
EXECUTE IMMEDIATE update_block USING 
C_TABELLA, C_CAMPO, C_TIPO_CAMPO, C_LUNG_CAMPO, C_CAMPO_ACCESSO, COMPARA_VARCHAR, COMPARA_CHAR, COMPARA_NUMBER,
'XX','GDPR','XX','GDPR'; 

最新更新