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;