对Oracle触发器来说是一个新手.假设我在表emp中的插入上有一个触发器.有没有办法找出触发触发器的插入记录是什么.如果插入的记录是特定值,我希望触发器具有执行某些操作的代码.
我们有一个处理数据库中大量记录的过程.现在有时如果程序花费的时间过长,则用户手动取消该程序,从而抛出ORA-01013 EXCEPTION.但是,我们仍然想知道在取消程序之前处理了多少记录.我们尝试生成在EXCEPTION WHEN OTHERS块中调用的日志,但该块中的任何代码似乎都不起作用.我们甚至试图通过PRAGMA INIT EXCEPTIONORA-01013 提出一个例外而无济于事.代码似乎达到了异常但不执行任何代码.我猜测,由于该过程被取消,EXCEPTION块中的代码没有时间做任何事情而只是关闭.
知道如何获取在取消程序之前处理的记录的计数?我可以尝试在每次commit发生时增加记录但是想知道是否有更好的方法来实现这一点
我实现了一个监听器,它会通知我们是否在特定目录中收到新文件。这是通过轮询和使用 TimerTask 来实现的。现在程序的设置是,一旦收到新文件,它就会调用另一个 java 程序来打开该文件并验证它是否是正确的文件。我的问题是,由于轮询发生在指定的秒数后,可能会出现文件被复制到该目录中并因此被 Windows 锁定的情况。
这会引发 IOException,因为尝试打开它进行验证的其他 java 程序不能(“文件正在被另一个进程使用”)。
有没有办法我可以知道Windows何时完成复制,然后调用第二个程序从java进行验证?
如果有人需要代码片段来提供帮助,我将非常乐意发布代码片段。
谢谢
嗨,我有一个有趣的问题.我有一个员工表AS跟随
CREATE TABLE EMPLOYEE(
EMPLOYEE_ID INTEGER,
SALARY DECIMAL(18,2),
PAY_PERIOD DATE)
Run Code Online (Sandbox Code Playgroud)
现在,这些表中的员工中有些人每月获得报酬,有些是每周一次,有些是每两周一次,有些是每天一次.我们想要的是如果连续三个支付期的工资相等,找到一个指示'Y'的指标.让我们举个例子.
Employee Pay_Period Salary
1 01/01/2012 $500
1 08/01/2012 $200
1 15/01/2012 $200
1 22/01/2012 $200
1 29/01/2012 $700
Run Code Online (Sandbox Code Playgroud)
在这种情况下,指标应为"是",因为连续3个工资期的薪水为200美元.
由于支付周期的数量不是恒定的,我不确定如何编写这段代码,因为我不知道我需要多少左连接.因为我在Teradata中写这个我尝试使用RECURSIVE函数但是难倒.关于如何继续这个的一般想法?我宁愿不创建存储过程或具有PL/SQL逻辑.
我们有一个应用程序,它生成一些临时表,然后处理数据.我真的无法控制应用程序创建它的方式以及后续的查询.我们注意到Oracle使用全表扫描而不是使用索引作为表的主键.如果它使用主键索引,则进程运行速度会快很多.
由于我无法控制应用程序生成的选择查询,因此无法使用提示并强制Oracle使用主键索引.是否有任何其他设置我可以在某处更改可能会强制Oracle使用临时表的主键索引?
我有3张桌子:
(SELECT DISTINCT ID
FROM IDS)a
LEFT OUTER JOIN
(SELECT NAME, ID
FROM NAMES)b
ON a.ID = b.ID
LEFT OUTER JOIN
(SELECT ADDRESS FROM ADDRESSES
WHERE ROWNUM <2
ORDER BY UPDATED_DATE DESC)c
ON a.ID = c.ID
Run Code Online (Sandbox Code Playgroud)
ID只能有一个名称,但可以有多个地址.我只想要最新的一个.即使存在地址,此查询也会将地址返回为null,因为它只会从表中获取第一个地址,然后尝试LEFT JOIN到它无法找到的地址ID.编写此查询的正确方法是什么?
我有一个查询这样的表的游标
CURSOR Cur IS
SELECT Emp_No,status
from Employee
FOR UPDATE OF status;
Run Code Online (Sandbox Code Playgroud)
现在我想使用Emp_no从另一个表更新Employee表中的状态.完成此操作后,我需要使用此状态来调用自定义业务逻辑,而不是光标检索的原始状态.解决这个问题的最佳方式是什么?这是我写的.顺便说一句,我声明了一个名为v_status的变量
FOR Rec IN Cur LOOP
BEGIN
UPDATE Employee
SET status = (select a.status from Employee_Status where a.Emp_No = rec.Emp_No)
WHERE CURRENT OF Cur ;
COMMIT;
END;
SELECT status INTO v_status
FROM Employee
where Emp_No = rec.Emp_No;
IF(v_status = 'Active') THEN
-- Custom Business Logic
ELSE
-- Business logic
END IF;
END LOOP;
Run Code Online (Sandbox Code Playgroud)
什么是更好的方法来实现这一目标?