这就是块:
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 块再次生成不一致的number
。Case 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';