我需要创建一个在影子表中写入更改的触发器.我知道如何创建触发器但我的挑战是我需要新表中的记录即使在回滚后仍然存在.
这是输出结果的示例
INSERT INTO department VALUES (95, 'PURCHASING', 'CHICAGO');<br>
ROLLBACK;
1 rows inserted.
rollback complete.
SELECT * FROM department_log;
DEPARTMENT_ID DEPARTMENT_NAME ADDRESS OPERATION_TIME
---------------------- -------------------- -------------------- ------------------
90 HR CHICAGO 03-NOV-11
95 PURCHASING CHICAGO 03-NOV-11
SELECT * from department WHERE department_id >= 90;
DEPARTMENT_ID DEPARTMENT_NAME ADDRESS
---------------------- -------------------- --------------------
90 HR CHICAGO
Run Code Online (Sandbox Code Playgroud) 我有一张桌子电影.
create table Movie
(
mv_id number(5),
mv_name varchar2(30),
startdate date
)
insert into Movie values(1,'AVATAR','8-MAR-2012');
insert into Movie values(2,'MI3','20-MAR-2012');
insert into Movie values(3,'BAD BOYS','10-Feb-2012');
Run Code Online (Sandbox Code Playgroud)
我想创建一个触发器,以确保如果satrt日期早于当前日期,则不会删除任何记录.我的触发器代码是 -
create or replace trigger trg_1
before delete
on Movie
for each row
when(old.startdate < sysdate)
begin
raise_application_error(-20001, 'Records can not be deleted');
end;
Run Code Online (Sandbox Code Playgroud)
触发器已创建.当我执行此代码以删除数据时 -
delete from Movie where mv_id=1;
Run Code Online (Sandbox Code Playgroud)
然后触发器触发但有错误,我不知道为什么我会收到这样的错误.我不想要任何错误,我只想要消息.这是错误 -
delete from Movie where mv_id=1
*
ERROR at line 1:
ORA-20010: Records can not be deleted
ORA-06512: at "OPS$0924769.TRG_1", line 3 …Run Code Online (Sandbox Code Playgroud) 例如
它将从表中查看
例如,表格看起来像这样,所以使用townID它应该能够找到该县.
TownID || Town || County ||
Run Code Online (Sandbox Code Playgroud)
谢谢
我是正规表达的新手,在学习中我在一些基本的困惑中,你可以解释这个表达
询问
SELECT REGEXP_REPLACE('Having fun with', '([a-z])+', 'A') FROM dual;
Run Code Online (Sandbox Code Playgroud)
结果:
HA A A
Run Code Online (Sandbox Code Playgroud)
询问
SELECT REGEXP_REPLACE('Having fun with', '([a-z])*', 'A') FROM dual;
Run Code Online (Sandbox Code Playgroud)
结果:
AHAA AA AA
Run Code Online (Sandbox Code Playgroud)
根据这些查询及其结果,我无法理解+和*之间的主要区别.
鉴于下表
PAYMENT_Date TRANSACTION_TYPE PAYMENT_AMT
1/1/2012 P 184366
1/1/2012 R -5841
1/2/2012 P 941
1/3/2012 P 901
1/3/2012 R 5841
Run Code Online (Sandbox Code Playgroud)
以及以下查询:
select payment_date, transaction_type, payment_amt,
SUM(payment_amt) OVER(ORDER BY payment_date, transaction_type
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS RUNNING_BALANCE
from TABLE;
Run Code Online (Sandbox Code Playgroud)
我得到这些结果:
PAYMENT_Date TRANSACTION_TYPE PAYMENT_AMT RUNNING_BALANCE
1/1/2012 P 184366 0
1/1/2012 R -5841 -184366
1/2/2012 P 941 -178525
1/3/2012 P 901 -179466
1/3/2012 R 5841 -180367
Run Code Online (Sandbox Code Playgroud)
预期:
PAYMENT_Date TRANSACTION_TYPE PAYMENT_AMT RUNNING_BALANCE
1/1/2012 P 184366 0
1/1/2012 R -5841 184366
1/2/2012 P …Run Code Online (Sandbox Code Playgroud) 我正在努力创造一个每个圣诞节都会运行某个程序的工作.这是我走了多远:
declare
jobno number;
begin
dbms_job.submit( jobno,
'BEGIN GiveCoins; END;',
to_date('12/25', 'MM/DD'),
'sysdate + ?');
end;
/
Run Code Online (Sandbox Code Playgroud)
然而,我似乎无法找到一个简单的方法来改变每年的间隔,我只是一般很困惑如何去做这个,任何帮助非常感谢
使用 SQL*Plus 我尝试使用 select union 语句来组合同一表中两列的结果,如下所示:
select substr(startdate,4,3) milestone
from projects
union
select substr(enddate,4,3) milestone
from projects
Run Code Online (Sandbox Code Playgroud)
使用列的别名milestone,但由于某种原因,结果显示为列名称mil。由于某种原因它被截断了,我认为这substr部分是问题所在,因为它从stardateandenddate列中获取了 3 个字符。我应该如何解决这个问题?
我有一个名为Student的表格如下:
CREATE TABLE "STUDENT"
( "ID" NUMBER(*,0),
"NAME" VARCHAR2(20),
"AGE" NUMBER(*,0),
"CITY" VARCHAR2(20),
PRIMARY KEY ("ID") ENABLE
)
Run Code Online (Sandbox Code Playgroud)
我想把所有年龄都大于平均年龄的学生记录下来.这是我试过的:
SELECT *
FROM student
WHERE age > AVG(age)
Run Code Online (Sandbox Code Playgroud)
和
SELECT *
FROM student
HAVING age > AVG(age)
Run Code Online (Sandbox Code Playgroud)
两种方式都不起作用!
鉴于此示例(DUP_VAL_ON_INDEX异常),是否可以捕获违反约束的值以便记录它们?
如果批量插入生成多个违规,方法是否相同?
BEGIN
-- want to capture '01' and '02'
INSERT INTO Employee(ID)
SELECT ID
FROM (
SELECT '01' ID FROM DUAL
UNION
SELECT '02' ID FROM DUAL
);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
-- log values here
DBMS_OUTPUT.PUT_LINE('Duplicate value on an index');
END;
Run Code Online (Sandbox Code Playgroud) 我正在尝试将表格数据从开发框db复制到uat db,它们是2个不同的数据库.我正在尝试toad.All连接细节是正确的,但它不工作,并抛出以下错误.
[错误]执行(12:1):ORA-00900:无效的SQL语句
这就是我想要的
copy from abc/cde@//abc.abc.com:1521/devbox to abc/cde@//abc.abc.com/uatbox
INSERT TOOL_SERVICE_MAPPING (*)
USING (SELECT * FROM TOOL_SERVICE_MAPPING)
Run Code Online (Sandbox Code Playgroud)