简体   繁体   English

ORA-06502: PL/SQL: ora_sql_txt 出现数字或值错误

[英]ORA-06502: PL/SQL: numeric or value error by ora_sql_txt

I have table for ddl logs.我有 ddl 日志表。 And in this table I also want to see which code was exactly done.在这个表中,我还想查看哪些代码完全完成了。 How can I put it into sql_tt column?我怎样才能把它放到 sql_tt 列中? Can you prompt me with this?你能用这个提示我吗?

CREATE TABLE AAUDIT_DDL (
d date,
OSUSER varchar2(255),
CURRENT_USER varchar2(255),
HOST varchar2(255),
IP_ADDRESS   VARCHAR2(100 CHAR),
TERMINAL varchar2(255),
owner varchar2(30),
OBJECT_TYPE varchar2(30),
OBJECT_NAME varchar2(30),
DDL_TYPE varchar2(30),
SQL_TT varchar(100));

and trigger并触发

create or replace trigger aaudit_ddl after ddl on DATABASE

begin
if (ora_sysevent='REVOKE')
then
null; -- I do not care about REVOKE
else
insert into aaudit_ddl(d, osuser,current_user,host,ip_address,terminal,owner,OBJECT_TYPE,OBJECT_NAME,DDL_TYPE,SQL_TT)
values(
  sysdate,
  sys_context('USERENV','OS_USER') ,
  sys_context('USERENV','CURRENT_USER') ,
  sys_context('USERENV','HOST') ,
  SYS_CONTEXT('USERENV','IP_ADDRESS'),
  sys_context('USERENV','TERMINAL') ,
  ora_dict_obj_owner,
  ora_dict_obj_type,
  ora_dict_obj_name,
  ora_sysevent,
  ora_sql_txt
  );
  end if;
  end;
 /

Documentation suggests different approach to ora_sql_txt : as function expects IN parameter (which is an integer, representing number of elements in PL/SQL table), you should 文档ora_sql_txt提出了不同的方法:由于函数需要IN参数(它是一个整数,表示 PL/SQL 表中的元素数),您应该

CREATE TABLE event_table (col VARCHAR2(2030));

DECLARE
  sql_text   ora_name_list_t;
  n          PLS_INTEGER;
  v_stmt     VARCHAR2(2000);
BEGIN
  n := ora_sql_txt(sql_text);

  FOR i IN 1..n LOOP
    v_stmt := v_stmt || sql_text(i);
  END LOOP;

  INSERT INTO event_table VALUES ('text of triggering statement: ' || v_stmt);
END;

This is how I have mine setup and it works fine.这就是我的设置方式,它运行良好。


 --Table will be created by sys user with tbs_audit as tablespace as default tablespace for audit table AUDIT_DDL

CREATE TABLE AUDIT_DDL ( 
DDL_DATE date, 
OSUSER varchar2(255),
CURRENT_USER varchar2(255),
HOST varchar2(255), 
TERMINAL varchar2(255), 
IP_ADDRESS VARCHAR2(100), 
module varchar2(100),
owner varchar2(30), 
type varchar2(30), 
name varchar2(30), 
sysevent varchar2(30),
sql_txt varchar2(4000) ) 
tablespace tbs_audit ;

--- Trigger will be created at sys user, so that all statements will be captured in any schema in the database

create or replace trigger
sys.audit_ddl_trg after ddl on database
declare
sql_text ora_name_list_t;
stmt VARCHAR2(4000) := '';
n number;
begin
n:=ora_sql_txt(sql_text);
for i in 1..n
loop
stmt:=substr(stmt||sql_text(i),1,4000);
end loop;
insert into audit_ddl(
DDL_DATE,osuser,
current_user,host,
terminal,
ip_address,module,
owner,
type,name,sysevent,sql_txt)
values(
sysdate,
sys_context('USERENV','OS_USER') ,
sys_context('USERENV','CURRENT_USER') ,
sys_context('USERENV','HOST') ,
sys_context('USERENV','TERMINAL') ,
UTL_INADDR.get_host_name('USERENV'),
sys_context('USERENV','MODULE') ,
ora_dict_obj_owner,
ora_dict_obj_type,
ora_dict_obj_name,
ora_sysevent,
stmt
);
end;
/

-- Sql Query can be used to lookup the captured ddl in the audit_ddl table.
col type format a10
col name format a10
col host format a16
col IP_ADDRESS format a10
col terminal format a20
col owner format a15
col sql_txt format a20
col SYSEVENT format a10
col CURRENT_USER format a10
col osuser format a10
select * from AUDIT_DDL;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 SQL错误:ORA-06502:PL / SQL:数字或值错误 - SQL Error: ORA-06502: PL/SQL: numeric or value error 奇怪的ORA-06502:PL / SQL:数字或值错误 - Strange ORA-06502: PL/SQL: numeric or value error ORA-06502: PL/SQL: 连接时出现数字或值错误 - ORA-06502: PL/SQL: numeric or value error when concatenating 获取ORA-06502:PL / SQL:数字或值错误:SQL触发器中的字符到数字转换错误 - Getting ORA-06502: PL/SQL: numeric or value error: character to number conversion error in SQL trigger ORA-06502:PL / SQL:数字或值错误:Oracle SQL查询中的字符串缓冲区太小 - ORA-06502: PL/SQL: numeric or value error: character string buffer too small in Oracle sql query ORA-06502 PL / SQL:数字或值错误:字符到数字的转换错误; - ORA-06502 PL/SQL: numeric or value error: character to number conversion error; Oracle数据库错误:ORA-06502:PL / SQL:数字或值错误:字符串缓冲区太小 - Oracle Database Error: ORA-06502: PL/SQL: numeric or value error: character string buffer too small ORA-06502:PL / SQL:数字或值错误:数字精度太大 - ORA-06502: PL/SQL: numeric or value error: number precision too large 包含4000个以上字符的Substr获得ORA-06502:PL / SQL:数字或值错误 - Substr with more than 4000 characters gets ORA-06502: PL/SQL: numeric or value error ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小,只有三个数字 - ORA-06502: PL/SQL: numeric or value error: character string buffer too small only three numbers
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM