Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 执行即时插入ORACLE时出错_Sql_Oracle_Execute Immediate - Fatal编程技术网

Sql 执行即时插入ORACLE时出错

Sql 执行即时插入ORACLE时出错,sql,oracle,execute-immediate,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 TRIGGE

晚安。 我对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');
当我使用打印功能在没有立即执行的情况下运行时,结果如下:

插入到临时PK值中(编码,编号:NEW.CODCIDADE)

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

从命令中的第62行开始出错-插入Cidade值 (11,'Alegre','ES')错误报告-SQL错误:ORA-00936:缺失 表达式ORA-06512:位于“PAULA.ICIDADE”,第34行ORA-04088:错误 执行触发器“PAULA.ICIDADE”时 93600000-“缺少表达式”

可能是个愚蠢的错误,但我找不到


有人能帮我吗?从现在开始,谢谢。

我建议您在执行之前使用DBMS\u OUTPUT.PUT\u LINE来输出
stm
。这将使您更容易看到正在运行的内容以及生成错误SQL的原因


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

看起来您需要在插入到COL\u NAME和COL\u 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;

分享和享受。

所以我看到了输出,以前是打印的。我刚刚在这里发布了我的问题是“:new”,因为我需要根据表名获取它的值,你知道我该怎么做吗?如果你从触发器中取出SELECT语句并在SQL*Plus之类的查询工具中运行,它会返回你期望的列名和值吗?是的,通常情况下,如果必须用动态插入填充临时PK,那么@bob Jarvis的插入操作相当棘手。通常主键的定义不会更改太多次,因此静态插入就足够了。你应该考虑编写一个专用的插入程序来完成所有的操作,而不是使用触发器。谢谢。这个错误解决了另一个出现的*Sad*,给出了“并非所有变量都有界”。但现在我将尝试解决这个问题。再次感谢,问题是触发器中的“NEW”一词用于列的新值,但也用于绑定变量的动态SQL中。我不认为有任何解决方案可以在触发器中同时使用这两种方法。