我试图触发,当插入数据时,它会修剪正在插入的数据.
这是我正在尝试..
CREATE OR REPLACE TRIGGER trig_trim
BEFORE INSERT ON triggertest
FOR EACH ROW
BEGIN
TRIM(:new.testchar);
END;
/
Run Code Online (Sandbox Code Playgroud)
我像这样插入
INSERT INTO triggertest (testnum, testchar) VALUES (9, ' r9 ');
Run Code Online (Sandbox Code Playgroud)
我收到这个错误......
04098. 00000 - "trigger '%s.%s' is invalid and failed re-validation"
*Cause: A trigger was attempted to be retrieved for execution and was
found to be invalid. This also means that compilation/authorization
failed for the trigger.
*Action: Options are to resolve the compilation/authorization errors,
disable the trigger, or drop the trigger. …Run Code Online (Sandbox Code Playgroud) 我UPDATE在Oracle 11g服务器上运行的语句很长:
UPDATE Table SET Column1 = 'One' WHERE Column2 = 'Example';
UPDATE Table SET Column1 = 'Two' WHERE Column2 = 'Something';
-- ...
Run Code Online (Sandbox Code Playgroud)
我想检查每个UPDATE行是否恰好影响了一行(不为零,不超过一行),如果它没有停止执行,则引发错误并回滚所有更新。
我希望这样的语法:
UPDATE Table SET Column1 = 'One' WHERE Column2 = 'Example';
ASSERT sql%rowcount = 1;
Run Code Online (Sandbox Code Playgroud)
那似乎不存在,所以也许我应该做这样的事情:
UPDATE Table SET Column1 = 'One' WHERE Column2 = 'Example';
IF sql%rowcount != 1 THEN
-- Do something, but what?
END IF;
Run Code Online (Sandbox Code Playgroud)
但是,我不确定在IF语句中添加什么,或者这是否是一个好方法。那么,实现这一目标的最优雅的方法是什么?
我有以下代码:
DECLARE
f_cd fee.fee_cd%type;
f_name fee.fee_nm%type;
f_new_cd fee.new_fee_cd%type;
f_new_name fee.new_fee_nm%type;
Cursor cur is
SELECT Fee_cd, fee_nm, new_fee_cd, new_fee_nm FROM Fee;
BEGIN
if cur%ISOPEN then
close cur;
end if;
open cur;
for rec in cur loop
fetch cur INTO f_cd, f_name, f_new_cd, f_new_name;
dbms_output.put_line ('The Fee Code ' || f_cd
|| ' is the one you selected and it''s name is '
|| f_name);
end loop;
close cur;
END;
Run Code Online (Sandbox Code Playgroud)
但我一直收到错误信息
原因: 尝试打开已打开的游标.
操作: 在重新打开之前先关闭光标.
我不知道发生了什么.当我改变代码以取消它for loop并使用loop... end loop …
我们在Oracle生产环境中有一个计划任务,它运行一个存储过程来在dev和prod中的相同模式之间复制数据.(这是解决业务问题的一种权宜之计,直到我们的开发人员有时间正确解决它.)
我们通过从prod复制擦除数据来定期刷新我们的开发和测试环境.该副本包括任务和存储过程.如果存储过程在除生产中的那些服务器之外的任何服务器上运行,我们冒着破坏数据的风险,因此我必须记得告诉DBA在开发和测试中禁用该任务.
有没有办法(通过pl/sql?)来阻止存储过程在我们的生产环境之外运行?
作为故障保护,该过程使用未在dev或test中定义的别名,我宁愿避免生成的错误.
我正在使用PLSQL创建一个基于查询另一个表来更新表的过程,并且我正在使用循环来实现此目的.对于测试,我暂时不使用过程代码,只是尝试使下面的脚本工作.但它不断抛出错误,包括"遇到符号"文件结束""或"无效的SQL语句",基于小调整.我哪里错了?
DECLARE CURSOR cur IS
SELECT * FROM Summary;
BEGIN
FOR rec in cur
LOOP
UPDATE Award
SET monthly_sales = (
SELECT COUNT(*)
FROM Sales
WHERE employee_id = rec.employee_id
AND to_char(Sales.SALES_DATE,'YY/MM')=to_char(SYSDATE,'YY/MM')
)
WHERE Summary.employee_id = rec.employee_id
END LOOP
END;
/
Run Code Online (Sandbox Code Playgroud) 我有一个像这样的PL/SQL块:
BEGIN
FOR i IN 1..100
LOOP
UPDATE rptbody
SET comments = 'abcs';
WHERE (rptno> 100 and rptno < 200) and ROWNUM<2;
COMMIT;
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
需要使用Oracle JDBC执行此块.我尝试了以下方法:
试图使用Statement对象执行此操作.由于这是一个块,因此引发了一个异常,说这不是一个sql语句
这可以分成sql语句,但我有100个这样的块,这对于代码来说很麻烦,并且想把它留给sqlplus.
尝试使用CallableStatement也没有用.
任何解决方案都会有帮助.
我在这里查询了一些问题以及在线观看和观看视频,但我仍然感到困惑的是IN,OUT.我问的原因是因为我正在编写一个程序,根据其他程序中的IN参数记录错误,
干杯!
我有PL/SQL代码以下,这不是进入IF块.为什么不进入IF Block?
感谢您的回复.
DECLARE
p_datacenterid VARCHAR2(50) := '';
p_dcid VARCHAR2(50);
BEGIN
dbms_output.put_line('test');
-- Check if DataCenterId is null
IF nvl(p_datacenterid, '') = '' THEN
dbms_output.put_line('DataCenterID is empty');
SELECT datacenterid
INTO p_dcid
FROM pod_tab
WHERE url = 'dit3.ezlm.adp.com'
AND rownum = 1;
END IF;
END;
/
Run Code Online (Sandbox Code Playgroud) 如果在所有者帐户下调用,则以下语法可以正常工作:
SELECT "MY_OWNER"."MY_PACKAGE".Convert(t.Value) FROM My_Table t
Run Code Online (Sandbox Code Playgroud)
但是当从另一个用户调用时,我收到以下错误:
ORA-00904: : invalid identifier
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
Error at Line: 1 Column: ??
Run Code Online (Sandbox Code Playgroud)
哪一栏:?? 指着
SELECT "MY_OWNER"."MY_PACKAGE".Convert(t.Value) FROM My_Table t
?
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
UPDATE.这是一个被称为的函数:
FUNCTION Convert ...
Run Code Online (Sandbox Code Playgroud) 我有这样的delcared函数:
CREATE or replace PROCEDURE proc
(
P_ID IN INTEGER,
NAME OUT CHAR,
SURNAME OUT CHAR,
TOTAL OUT CHAR
)
AS
BEGIN
SELECT NAME, SURNAME, sum(TOTAL) AS TOT
INTO NAME,SURNAME,TOTAL
FROM STATISTICS, PLAYERS, PERSON
WHERE STATISTICS.SID=P_ID AND PERSON.ID=PLAYERS.SID AND
STATISTICS.PLAYERS_SID=PLAYERS.SID
GROUP BY NAME,SURNAME;
END;
Run Code Online (Sandbox Code Playgroud)
Select语句有效,但如何在Oracle中调用此过程?
我试过类似的东西
EXEC proc(4);
Run Code Online (Sandbox Code Playgroud)
和
DECLARE
NAME OUT CHAR,
SURNAME OUT CHAR,
TOTAL OUT CHAR
BEGIN
P_ID := 12 ;
proc (
P_ID => P_ID,
NAME => NAME,
SURNAME => SURNAME,
TOTAL => TOTAL
);
END; …Run Code Online (Sandbox Code Playgroud)