Ошибка при получении вновь вставленной записи через триггер-PLSQL
Я пытаюсь создать триггер в таблице EMP, который будет проверять вставки в таблице EMP_AUDIT и отправлять почту на соответствующий empno. Я не получаю только что вставленную запись во вложение CSV, которое создается в v_block_query. Я хочу получить эту базу данных:new.FIELD_NAME, но выдает ошибку:
ORA-01008: не все переменные связаны ORA-06512: в "SCOTT.EMP_AFTER_INSERT", строка 18 ORA-04088: ошибка во время выполнения триггера "SCOTT.EMP_AFTER_INSERT"
create or replace TRIGGER emp_after_insert
AFTER INSERT
ON emp
FOR EACH ROW
DECLARE
v_block_qry VARCHAR2(3000);
v_block_row VARCHAR2(6000);
TYPE bl_cur IS REF CURSOR;
v_result bl_cur;
v_rowcount NUMBER;
v_attachment CLOB;
v_username varchar2(10);
v_no number(4);
v_name varchar2(10);
v_email varchar2(30);
v_subj varchar2(30);
BEGIN
insert into emp_audit(id,name,insertion_date) values(:new.empno,:new.ename,sysdate);
dbms_output.put_line('inserted'||:new.empno);
v_attachment := '"COL1", "COL2"' || CHR(13) || CHR(10);
v_block_qry := 'SELECT ''"'' || new.empno || ''", "'' || new.ename || ''", "'' || insertion_date ||''"'' AS ROWTXT FROM emp_audit ';
OPEN v_result FOR v_block_qry;
LOOP
v_rowcount := v_result%ROWCOUNT;
FETCH v_result INTO v_block_row;
EXIT WHEN v_result%NOTFOUND;
v_attachment := v_attachment || v_block_row || chr(13) || chr(10);
END LOOP;
CLOSE v_result;
dbms_output.put_line(v_attachment);
select email into v_email from dept_email where deptno=:new.empno;
dbms_output.put_line(v_email);
v_subj:= 'MAIL_SUBJECT ' || TO_CHAR(TRUNC(SYSDATE-1), 'YYYY-MM-DD');
UTL_MAIL.send_attach_varchar2(sender => 'abc@gmail.com',
recipients => v_email,
subject => 'mail testing',
message => 'current record',
mime_type => 'text/html; charset=us-ascii', -- send html e-mail
attachment => v_attachment,
att_inline => FALSE,
att_filename => 'Change_Report' || TO_CHAR(TRUNC(SYSDATE-1), 'YYYY-MM-DD') || '.csv');
END;
Пожалуйста помоги. заранее спасибо
3 ответа
V _block_qry:= 'SELECT' '"' '|| BRANCH_NUMB ||' '", "' '|| LOAN_CODE ||' '", "' '|| LOAN_PRODUCT_NUMB ||' '", "' '|| BRM_NUM | | "''," '' || CURR_CODE || "''," '' || NAME_DESN || '' "," '' || CNIC_NUMB || '' "," '' || PRINCIPAL_NEW || ' '","' '|| AMOUNT_APPLIED_NEW ||' '","' '|| ACCT_BASC ||' '","' '|| ACCT_SFIX ||' '","' '|| DATE_ADDED_NEW ||' '", "'' || DATE_DUE_NEW || ''", "'' || B_STATUS || ''", "''|| S_STATUS || '' "," '' || DISB_TOTAL_AMOUNT_NEW || '' "''," '' || OUTSTANDING_PRINCIPAL_NEW || '' "," '' || GROUPBR_NEW || '' "," '' || INSERTED_DATE || '' "''
'КАК ROWTXT
FROM SMFB.LMFLOANSNEW where branch_numb = :new.branch_code;
v_block_qry := 'SELECT ''"'' || new.empno || ''", "'' || new.ename || ''", "'' || insertion_date ||''"'' AS ROWTXT FROM emp_audit ';
OPEN v_result FOR v_block_qry;
Вы не можете использовать new.empno
а также new.ename
в вашем запросе
Заменить
(SELECT ''"'' || new.empno || ''", "'' || new.ename || ''", "'' || insertion_date ||''"'' )
в вашем запросе с
(SELECT ''"'' || empno || ''", "'' || ename || ''", "'' || insertion_date ||''"'' )
v_block_qry := 'SELECT ''"'' || BRANCH_NUMB || ''", "'' || LOAN_CODE || ''", "'' || LOAN_PRODUCT_NUMB || ''"
, "'' || BRM_NUM || "'', "'' || CURR_CODE || "'', "'' || NAME_DESN || ''", "'' || CNIC_NUMB || ''"
, "'' || PRINCIPAL_NEW || ''", "'' || AMOUNT_APPLIED_NEW || ''", "'' || ACCT_BASC || ''", "'' || ACCT_SFIX || ''"
, "'' || DATE_ADDED_NEW || ''", "'' || DATE_DUE_NEW || ''", "'' || B_STATUS || ''", "'' || S_STATUS || ''", "'' || DISB_TOTAL_AMOUNT_NEW || ''"''
, "'' || OUTSTANDING_PRINCIPAL_NEW || ''", "'' || GROUPBR_NEW || ''", "'' || INSERTED_DATE || ''"''
AS ROWTXT FROM SMFB.LMFLOANSNEW where branch_numb='||:new.branch_code;
from ключевое слово не найдено там, где ожидалось. Это в живой среде. Предыдущий код был в моей БД