晚安。我有一个问题,在oracle执行立即。我看了其他的话题,但没有答案是有用的。代码如下:首先,我需要在触发器中插入的表…
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函数,结果如下:
INSERT INTO TEMP_PK VALUES (CODCIDADE, NUMBER,:NEW.CODCIDADE);
使用EXECUTE IMMEDIATE,给出以下错误:
command - Insert into Cidade VAlues中从第62行开始错误(11,'Alegre','ES')错误报告- SQL错误:ORA-00936: missing表达式ORA-06512: at"PAULA"。第34行ORA-04088:错误在触发'PAULA '执行期间。ICIDADE"00936. 00000 - "缺少表达式"
可能是一个愚蠢的错误,但我找不到。
有谁能帮我吗?从现在开始,谢谢你。
我建议您使用DBMS_OUTPUT。PUT_LINE用于在执行stm
之前输出它。这将使您更容易看到您正在运行的内容以及为什么生成了错误的SQL。
首先,您没有将任何内容绑定到:NEW
看起来您需要在插入到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;
分享快乐。