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

Sql 立即执行:绑定变量不存在&数据类型不一致,sql,oracle,cursor,Sql,Oracle,Cursor,这就是街区: 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_ANAGRAFI

这就是街区:

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; 

您不使用任何绑定变量,它应该类似于这个快速且脏的绑定变量:

    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'; 

您的代码存在多个问题:

在update_块中未使用bind变量,但仍在使用块。您应该从executeimmediate中删除using块。 NUM_ISCRIZIONE_CCIAA列是数字类型,当您的else块再次生成不一致的数字时,您尝试使用case更新它。必须生成相同数据类型结果的情况。 有关绑定变量的更多详细信息,请参阅


干杯

表格的结构是什么:DWH_SIC_ANAGRAFICA_测试?请在问题上分享它。您的executeimmediate也有using关键字,但您的查询中没有绑定变量。绑定变量直接在“:”冒号后面的字符串中使用。比如:bind变量。因此,在您的块中,使用executeimmediate update_块直接执行字符串;您的NUM_ISCRIZIONE_CCIAA列为NUMBER7,0数据类型,update语句将尝试为此列设置“xxxx”值。其结果是失败并通过ora-00932。错误我已经上传了表格的结构。很抱歉再次询问您,但在我的情况下如何使用bindvariable?@kfinity:自动数据转换应将“0”转换为0的数值,但在DBMS_输出结果中,它被打印为“xxxx”。哦,你说得对,问题实际上是ELSE部分——它选择了一个与其他情况不匹配的数字。如果他们试图结束“C|u CAMPO||||”的话,我想这应该行得通。谢谢大家。我终于解决了这个问题。祝你有美好的一天!
 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 := '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'; 
EXECUTE IMMEDIATE update_block;