EXECUTE IMMEDIATE中的错误插入ORACLE

时间:2014-06-03 02:09:28

标签: sql oracle execute-immediate

晚安。 我在oracle中执行EXECUTE IMMEDIATE时遇到问题。 我看其他主题,但没有答案是有帮助的。 这是代码: 首先,我需要在触发器内插入表...

create global temporary table TEMP_PK (COL_NAME VARCHAR(100), COL_TYPE VARCHAR(100), ROW_VALUE VARCHAR(100)) on commit preserve rows;

现在,我的触发器

CREATE OR REPLACE TRIGGER ICidade AFTER
  INSERT ON Cidade FOR EACH ROW DECLARE TYPE EmpCurTyp IS REF CURSOR;
  emp_cv EmpCurTyp;
  col_name_aux VARCHAR(100);
  col_type_aux VARCHAR(100);
  stm          VARCHAR(4000):='';
  BEGIN
    -- Pegando as PKS
    FOR j IN
    (SELECT d.Column_Name coluna,
        d.DATA_TYPE tipo
      FROM user_cons_columns ucc,
        user_constraints uc,
        (SELECT COLUMN_NAME,DATA_TYPE FROM ALL_TAB_COLUMNS WHERE TABLE_NAME='CIDADE'
        ) d
      WHERE uc.constraint_name=ucc.constraint_name
      AND uc.constraint_type  ='P'
      AND uc.table_name       = 'CIDADE'
      AND d.COLUMN_NAME       =ucc.Column_Name
    )
    LOOP
      stm := concat
      (
        stm, 'INSERT INTO TEMP_PK VALUES ('
      )
      ;
      stm := concat(stm, j.coluna);
      stm := concat(stm,', ');
      stm := concat(stm, j.tipo);
      stm := concat(stm,', ');
      stm := concat(stm, ':NEW.');
      stm := concat(stm,j.coluna);
      stm := concat(stm,')');

      EXECUTE IMMEDIATE stm;
      stm:='';
    END LOOP;


  END ICidade;
  /

编译好。问题是我在表格中添加一个条目" Cidade" 当我尝试插入时,例如:

Insert into Cidade Values (11,'Alegre','ES');

当我在没有立即执行的情况下运行时,使用print函数,结果是:

  

插入TEMP_PK值(CODCIDADE,NUMBER,:NEW.CODCIDADE);

使用EXECUTE IMMEDIATE,出现以下错误:

  

从第62行开始出错:命令中的62 - 插入Cidade VAlues   (11,' Alegre' ES')错误报告 - SQL错误:ORA-00936:丢失   表达式ORA-06512:at" PAULA.ICIDADE",第34行ORA-04088:错误   在执行触发器期间,PAULA.ICIDADE'   00936. 00000 - "缺少表达"

可能是一个白痴错误,但我无法找到。

那么有人可以帮助我吗?从现在开始,谢谢。

2 个答案:

答案 0 :(得分:1)

我建议您在执行之前使用DBMS_OUTPUT.PUT_LINE输出stm。这样可以更容易地查看您正在运行的内容以及生成错误SQL的原因。

首先,您没有将任何内容绑定到:NEW

答案 1 :(得分:0)

看起来您需要在插入到COL_NAME和COL_TYPE列中的字符串文字周围添加单引号。尝试将触发器重写为:

CREATE OR REPLACE TRIGGER ICidade AFTER
  INSERT ON Cidade FOR EACH ROW DECLARE TYPE EmpCurTyp IS REF CURSOR;
  emp_cv EmpCurTyp;
  col_name_aux VARCHAR(100);
  col_type_aux VARCHAR(100);
  stm          VARCHAR(4000):='';
  BEGIN
    -- Pegando as PKS
    FOR j IN
    (SELECT d.Column_Name coluna,
        d.DATA_TYPE tipo
      FROM user_cons_columns ucc,
        user_constraints uc,
        (SELECT COLUMN_NAME,DATA_TYPE FROM ALL_TAB_COLUMNS WHERE TABLE_NAME='CIDADE'
        ) d
      WHERE uc.constraint_name=ucc.constraint_name
      AND uc.constraint_type  ='P'
      AND uc.table_name       = 'CIDADE'
      AND d.COLUMN_NAME       =ucc.Column_Name
    )
    LOOP
      stm := 'INSERT INTO TEMP_PK (COL_NAME, COL_TYPE, ROW_VALUE) ' ||
             'VALUES (''' || j.coluna || ''', ' ||
                      '''' || j.tipo || ''', ' ||
                      ':NEW.' || j.coluna || ')';

      EXECUTE IMMEDIATE stm;
    END LOOP;
  END ICidade;

分享并享受。