Oracle 显示为运行触发器而输入的命令

Oracle 显示为运行触发器而输入的命令,oracle,plsql,triggers,Oracle,Plsql,Triggers,我试图弄清楚如何显示用户输入的insert语句。我希望它在请更新insert语句文本打印后显示。通过在线阅读大量内容,我发现您可以显示在oracle上输入的上一个命令,方法是输入/sign,还可以运行以下查询“SELECT*From gv$sql,其中sql_ID=IDENT_CURRENT”gv$sql。我试着在触发器中使用execute立即语句,使用dbms_output.put_line/,并简单地使用t0_char'/;在下面的查询中。有什么建议吗 set serveroutput on

我试图弄清楚如何显示用户输入的insert语句。我希望它在请更新insert语句文本打印后显示。通过在线阅读大量内容,我发现您可以显示在oracle上输入的上一个命令,方法是输入/sign,还可以运行以下查询“SELECT*From gv$sql,其中sql_ID=IDENT_CURRENT”gv$sql。我试着在触发器中使用execute立即语句,使用dbms_output.put_line/,并简单地使用t0_char'/;在下面的查询中。有什么建议吗

set serveroutput on
CREATE or REPLACE trigger before_insert_t
before insert on reservations
for each row

DECLARE
rooms_remaining number(5,2);

BEGIN

select roooms_rem into rooms_remaining from reservations where roomno=:new.roomno;

if rooms_remaining = 0 then

    dbms_output.put_line('Insertion now allowed because room ' || :new.roomno || ' is booked!' );
dbms_output.put_line('Please update the insert statement');
--  to_char('/');
    dbms_output.put_line('insert into reservations values ' || :new.roomno  );
--  EXECUTE IMMEDIATE sql_stmt;
end if;
END;
/
show errors
insert into reservations values (99,9);

您可以按首次加载时间排序,并按降序排序,然后选择第一行,如果有多个插入,这将是最新的INSERT语句。

首先,IDENT\u CURRENT不是Oracle中定义的函数。这似乎是一个SQL Server函数-您是否在系统中实现了一个名为IDENT_CURRENT的自定义函数,该函数是按照SQL Server函数建模的?其次,您所说的“/”似乎是SQLPlus命令。这不是SQL或PL/SQL中可以使用的东西,而是特定于SQLPlus的客户端命令。在SQL*Plus中,我认为您所指的就是这些;不过,它对服务器没有任何意义,它是一个客户机命令。它执行上一个命令,但不显示它。您也可能不想假设执行插入的客户端将被设置为按照您的预期处理dbms_输出。警报-ORA-04091:表保留正在发生变化,触发器/函数可能看不到itI复制了错误的命令,但我一直在尝试使用v$sql表中的select语句来显示最后输入的命令,这方面我还不太熟悉。我使用的是sql*plus。即使您尝试使用v$sql,您打算如何识别INSERT语句?您是否计划使用…WHERE SQL_文本,如“插入保留%”?
CREATE or REPLACE trigger before_insert_t
before insert on TEST_TAB1
for each row    
DECLARE
  sql_insert varchar2(1000);    
BEGIN    
  select sql_text into sql_insert 
    from (select sql_text 
            from v$sql 
            where upper(sql_text) like 'INSERT INTO TEST_TAB1%'
            order by first_load_time desc)
   where rownum=1;  
  dbms_output.put_line('Inserting into table SQL is '||sql_insert);    
END;
/

SQL> set serveroutput on
SQL> insert into TEST_TAB1 values ('Hello');
1 rows inserted.
Inserting into table SQL is insert into TEST_TAB1 values (:"SYS_B_0")