我们目前有一个登录trigger,用于捕获从特定应用程序(即 SQL Plus、SQL Developer)登录到 Oracle 的会话的用户信息。它获取该信息并将其插入到表中以进行审计。
现在,如果用户通过我们捕获的这些应用程序之一登录,我们希望提示用户输入与他们登录原因相关的信息,然后将其写入同一个表中以进行审计。
关于我们如何用我们拥有的东西来做到这一点的任何想法,或者关于如何完成同样事情的任何其他想法?
当前Login Trigger:
begin
if (dba_monitor.get_program_name = 1)
then
insert into dba_monitor.logon_table2
(username,machine,program, logon_date)
select username,machine,program,sysdate
from v$session
where username=(select user from dual)
and username not in ('SYSMAN','DBSNMP');
else
insert into dba_monitor.logon_table
(user_name,logon_date)
select username,sysdate
from v$session
where username=(select user from dual)
and username not in ('SYSMAN','DBSNMP');
end if;
end;
Run Code Online (Sandbox Code Playgroud)
DBA_MONITOR.GET_PROGRAM 功能:
return varchar2
is
audit_program number :=0;
audit_select number :=0;
begin
select 1
into audit_program
from v$session
where …Run Code Online (Sandbox Code Playgroud) 我在将表与集合合并时遇到问题。假设我有一个表 emp。
这是我的 PL/SQL 代码片段。
TYPE empcol is table of emp%ROWTYPE INDEX BY BINARY_INTEGER;
tmpemp empcol;
-- Code here to load data from a CSV file into tmpemp collection
-- tmpemp(1).emp_id := parsedstring
-- etc.
MERGE INTO emp A using tmpemp B ON A.emp_id = B.emp_id
WHEN MATCHED THEN UPDATE SET A.fname = B.fname, A.lname = B.lname
WHEN NOT MATCHED THEN INSERT (emp_id, fname, lname) VALUES (b.emp_id, b.fname, b.lname);
Run Code Online (Sandbox Code Playgroud)
编译器不喜欢它。它抛出的 ORA-0942 - 表或视图不存在。我究竟做错了什么?或者我怎样才能做得更好。非常感谢您提供的任何帮助。
我收到以下错误:
58/6 PLS-00103:在预期以下情况之一时遇到符号“END”:
begin 函数 pragma procedure subtype type
当前游标删除
之前存在
任何人都知道我缺少什么?
CREATE OR REPLACE PROCEDURE VALIDATE_BI_JOB_COMPLETE_PROC AS
msg SYS.XMLTYPE;
msg_props DBMS_AQ.MESSAGE_PROPERTIES_T;
msg_id RAW(16);
queue_options DBMS_AQ.ENQUEUE_OPTIONS_T;
rec_count INTEGER;
/******************************************************************************
NAME: VALIDATE_BI_JOB_COMPLETE_PROC
*******************************************************************************
BEGIN
INSERT INTO JOB_LOG
(JOB_NAME, JOB_SEQUENCE, RUN_DATE, LINE_SEQ_NO, LOG_TXT)
VALUES
($$PLSQL_UNIT, 1, SYSDATE, 1, 'Job Started at ' || to_char(sysdate, 'MM/DD/YYYY HH:MI:SS'));
COMMIT;
rec_count := 0;
SELECT COUNT(*) INTO rec_count
FROM SCHEDULED_JOBS
WHERE JOB_NAME IN ('bi_get_transactional_data', 'bi_get_reference_data') AND
CURRENTLY_PROCESSING_FLG = 'Y';
IF rec_count > 0 THEN
BEGIN
DECLARE …Run Code Online (Sandbox Code Playgroud) 在插入乘客表后尝试触发触发器时,我会收到此错误。此触发器应该调用一个过程,该过程采用新插入值的两个参数,并基于此更新另一个表,即预订表。但是,我收到此错误:
ORA-04091: table AIRLINESYSTEM.PASSENGER is mutating, trigger/function may not see it
ORA-06512: at "AIRLINESYSTEM.CALCULATE_FLIGHT_PRICE", line 11 ORA-06512: at
"AIRLINESYSTEM.CALCULATE_FLIGHT_PRICE", line 15 ORA-06512: at
"AIRLINESYSTEM.CALCULATE_FLIGHT_PRICE_T1", line 3 ORA-04088: error during execution of
trigger 'AIRLINESYSTEM.CALCULATE_FLIGHT_PRICE_T1' (Row 3)
Run Code Online (Sandbox Code Playgroud)
我在 SQL 命令行中编译并测试了该过程,它工作正常。问题似乎出在触发器上。这是触发代码:
create or replace trigger "CALCULATE_FLIGHT_PRICE_T1"
AFTER
insert on "PASSENGER"
for each row
begin
CALCULATE_FLIGHT_PRICE(:NEW.BOOKING_ID);
end;?????
Run Code Online (Sandbox Code Playgroud)
为什么触发器不调用过程?
我知道如何以毫秒为单位检索时间戳:
to_char(systimestamp ,'YYYY-MM-DD HH24:MI:SS,FF9')
Run Code Online (Sandbox Code Playgroud)
任何人都可以请教,时间戳数据类型是否足以存储以毫秒为单位的日期,或者我可以使用 varchar2 吗?我正在尝试从 Java 插入这个值。
我必须将 oracle db 中的表更新为 10k 的批次。
我试过这个:
BEGIN
WHILE (true) LOOP
UPDATE TOP (10000) CUSTOMERS SET ACTIVE = 'N' WHERE ACTIVE='Y';
IF sql%notfound THEN
EXIT;
END IF;
COMMIT;
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为 plsql 不支持 top。
有什么建议?
我在 Toad 中为 oracle 创建了一个名为 error_log 的表。这样做的目的是记录以前编写的包可能遇到的任何错误,并记录它们以供开发人员查看。现在,我的任务是创建一个包/过程,它基本上会引发错误并能够将其记录到 error_log 表中?关于我将如何处理这件事的任何想法?
我需要用 Oracle 发送一封带有附件和文本的电子邮件。我之前使用过 UTL_MAIL,但是有了这个功能,附件的大小不能超过(我认为)32K。所以我尝试用 UTL_SMTP 发送它,这对附件更有效。
到目前为止,这是我的代码:
c := UTL_SMTP.OPEN_CONNECTION(mailserver);
UTL_SMTP.helo (c, mailserver);
UTL_SMTP.MAIL(c, sFrom);
UTL_SMTP.RCPT(c, sTo);
UTL_SMTP.OPEN_DATA(c);
UTL_SMTP.write_data(c, 'From: ' || sFrom || UTL_TCP.crlf);
UTL_SMTP.write_data(c, 'To: ' || sTo || UTL_TCP.crlf);
UTL_SMTP.write_data(c, 'Subject: ' || REPLACE(crec.descr, '[DATE]',TO_CHAR(sDATE,'DD.MM.YYYY')) || UTL_TCP.crlf);
UTL_SMTP.write_data(c, 'MIME-Version: 1.0' || UTL_TCP.crlf);
UTL_SMTP.write_data(c, 'Content-Type: multipart/mixed; boundary="' || c_mime_boundary || '"' || UTL_TCP.crlf);
UTL_SMTP.write_data(c, UTL_TCP.crlf);
UTL_SMTP.write_data(c, 'This is a multi-part message in MIME format.' || UTL_TCP.crlf);
UTL_SMTP.write_data(c, '--' || c_mime_boundary || UTL_TCP.crlf);
UTL_SMTP.write_data(c, 'Content-Type: text/plain' || UTL_TCP.crlf);
-- …Run Code Online (Sandbox Code Playgroud) 我遇到过并行运行许多访问同一个表的程序的情况。当我尝试并行运行这些程序时,我可以看到很少有程序抛出错误ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired。这些表是临时表,我首先删除旧数据然后插入。并再次为下一个程序运行做同样的事情。所以在这种情况下,我遇到了多个过程尝试访问同一个表并尝试执行 DML 操作的情况。我有针对这种情况创建全局临时表的解决方案:
CRATE GLOBAL TEMPORARY TABLE TEMP_ACTIVATE_OPTION(
ID NUMBER,
... -- your columns
)
ON COMMIT DELETE ROWS;
Run Code Online (Sandbox Code Playgroud)
但由于我是这个解决方案的新手,我真的不知道它是如何工作的。例如,如果一个过程正在运行并尝试访问该表TEMP_ACTIVATE_OPTION以进行 DML 操作,而另一个过程并行运行并尝试访问同一个表TEMP_ACTIVATE_OPTION进行 DML 操作,那么是否有可能发生数据丢失或冲突?全局临时表如何管理会话或事务?如果过程尝试对该表执行 dml 操作并等待释放表上的锁以便另一个过程可以访问同一个表,它是否对表执行锁定?
PROCEDURE "EXT_10024_ACTIVATE_OPTION"(IN_KPI_DEF_ID IN NUMBER DEFAULT 0) AS
IN_EVENT_ID NUMBER;
err_code VARCHAR(100);
err_msg VARCHAR(100);
IN_OBJECT_NAME VARCHAR2(100);
CURSOR KPI_DEF_CUR IS
Select KPI_DEF_ID,BUSINESS_CHECK_PERIOD_ID,BUS_CHK_PRD_ID_1,
CASE WHEN BUSINESS_CHECK_PERIOD_UNIT_ID=11 THEN 'MINUTE'
WHEN BUSINESS_CHECK_PERIOD_UNIT_ID=12 THEN 'HOUR'
WHEN BUSINESS_CHECK_PERIOD_UNIT_ID=13 THEN 'DAY'
WHEN BUSINESS_CHECK_PERIOD_UNIT_ID IS NULL THEN …Run Code Online (Sandbox Code Playgroud) Oracle 12c 12.1.0.2,SQL Developer 4.1.3.20
按照在线教程安装了 ORDS(无 APEX)并且自动启用功能工作正常,包括 POST 到启用的 (emp) 表,因此环境看起来不错。但是当我尝试在 POST 中定义 PL/SQL 服务时,我似乎无处可去。这是服务定义:
-- ORDS has been started in Standalone mode in SQL developer here
CREATE OR REPLACE PROCEDURE test_proc IS
BEGIN
INSERT INTO emp (empno, ename) VALUES (10, 'TEST');
END test_proc;
/
BEGIN
ORDS.DEFINE_SERVICE(
p_module_name => 'test' ,
p_base_path => 'test/',
p_pattern => 'simple_insert/',
p_method => 'POST',
p_source_type => ords.source_type_plsql,
p_source => 'BEGIN
hr.test_proc;
END;');
COMMIT;
END;
/
-- At this point the service is defined …Run Code Online (Sandbox Code Playgroud)