这是我的代码:
create or replace trigger tr_interdit
before delete on reservation
for each row
DECLARE
V_res_date RESERVATION.DATEFIN%type;
begin
SELECT DATEFIN into V_res_date
FROM reservation
where DATEFIN = :old.DATEFIN;
if V_res_date<add_months(V_res_date,-12)
then RAISE_APPLICATION_ERROR(-20001, 'Date fin na pas depasse un ans');
end if;
end tr_interdit;
/
Run Code Online (Sandbox Code Playgroud)
但是当我删除一行后,即使它不应该被删除,我也会收到这个错误.
这是错误:
删除"DANIEL"."保留",其中ROWID ='AAAFCvAABAAALHhAAA'和ORA_ROWSCN ='3392006'和("NUMR"为空或"NUMR"不为空)ORA-04091:表DANIEL.RESERVATION正在变异,触发/功能可能看不到它ORA-06512:在"DANIEL.TR_INTERDIT",第4行ORA-04088:执行触发器'DANIEL.TR_INTERDIT'时出错
Source_View只有近800条记录,但我的程序花了将近3分钟来更新PHONE表.我在每一步都有评论来解释逻辑.任何帮助表示赞赏.
要求:使用视图创建一个每天检查电话号码的流程并相应地进行更新.
1)从表1中获取所有区域keycol SELCT*FROM Table1 WHERE CATEGORY ='T';
2)从table2获取活动销售代表数据并获取其用户ID SELECT USER_ID FROM Table2 WHERE key_colval =''AND JOB_TITLE ='Sales Rep'AND STATUS ='Active';
3)使用该用户id查询source_VIEW SELECT*FROM source_VIEW WHERE USER_ID =''AND key_colval ='';
4)如果我们从上面的步骤中找不到任何内容,那么4.1)SELECT*FROM source_VIEW WHERE key_colval ='';
PROCEDURE main_PHONE_UPD
IS
V_USER_ID VARCHAR2(10);
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE TMP_source_VIEW';
EXECUTE IMMEDIATE 'INSERT INTO TMP_source_VIEW SELECT SUBSTR(key_col,6) key_colval,MOBILE,USER_ID FROM source_VIEW WHERE MOBILE IS NOT NULL'; -- Loading to temp table from source view
COMMIT;
FOR REC IN (SELECT key_colval
FROM Table1
WHERE CATEGORY = 'T' …Run Code Online (Sandbox Code Playgroud) 我需要创建一个视图,但我得到此错误"无效的标识符".问题是我尝试访问一个不存在的colum名称,但我需要在我的视图中(如果列不存在,我需要将null).这是我的代码sql:
select .......
case
when
when exists (select 1 from user_tab_columns where table_name = 'Student' and COLUMN_NAME = 'email') then nvl(SUBSTR(student.email, 0, 100),'') else ''
end as STUDENT_EMAIL,
Run Code Online (Sandbox Code Playgroud)
这是扔" invalid identifier".我需要创建这个视图并创建字段"email",如果存在colum,我必须插入正确的,否则我放入字段值null;
我有一个执行立即的查询字符串.
我怎么能执行立即这个PL/SQL?
query string ='执行立即选择....';
想要这样做: Execute immediate 'query string';
这变成了: Execute immediate 'Execute immediate select ....;';
你知道我怎么能这样做?
我试图确定为什么我的异常输出没有正确返回.
这适用于Oracle SQL Developer,使用PL/SQL进行练习.如果需要,我可以提供表格代码.
SET serveroutput on
CREATE OR REPLACE Procedure GetPermissions(user IN VARCHAR, docNum OUT
INTEGER)
IS
BEGIN
SELECT count(*) INTO docNum FROM UserPermissions where UserName=user;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Nothing found for this username');
END;
/
DECLARE
doc_count INTEGER;
BEGIN
doc_count:=0;
GetPermissions('Steve', doc_count);
dbms_output.put_line(' Number of documents: ' || doc_count);
END;
/
Run Code Online (Sandbox Code Playgroud)
我期待异常在'Steve'运行时返回其输出(没有找到),因为它不是我创建的表中的用户名.当前运行时只显示"文档数:0".
打算进行讨论。
我有一个结果表,它是由一个稍微复杂的查询(几个Joins和WHERE子句)生成的,随着我们的进行,我将在过程中多次操作/引用。
我唯一能想到的就是将查询结果存储在一个表中,并在过程结束时删除该表。这是可行的选择吗?有什么缺点?更好的选择?
我正在使用看起来像这样的oracle过程
CREATE PROCEDURE spName (
pCurosr OUT refcursor,
par2 IN VARCHAR := NULL,
....
....
par98 IN VARCHAR := NULL,
error OUT NUMBER
) AS
BEGIN
....
....
END
Run Code Online (Sandbox Code Playgroud)
问题是,某些过程使用了太多的参数,这些参数已将NULL设置为默认值。我想知道的是,是否可以执行这样的程序?
exec spName(:refcur, :par5 = 'value', :error);
Run Code Online (Sandbox Code Playgroud)
仅将我需要的供应参数和所有其他参数设置为默认值。
我必须找出现有的PL SQL包中要插入或更新到其中的表的列表。我开始分析该软件包。令人担忧的是,程序包代码在数千行代码中运行,并依次调用许多其他程序包。另外,代码不是我写的。由于它是开发环境,因此无法运行AWR报告。
启动事务后,是否有办法将插入/更新的表插入其中?是否可以编写触发器来满足我的要求?
我有一个如下定义的多级集合。
declare
type t_addr_lines is varray(4) of varchar2(60);
type t_addr_entry is table of t_addr_lines index by varchar2(10);
type t_student is record
(
last_name varchar2(20),
first_name varchar2(20),
l_addr_entry t_addr_entry
);
type t_students is table of t_student;
l_students t_students;
begin
l_students := t_students();
l_students.extend();
end;
Run Code Online (Sandbox Code Playgroud)
/
本质上,结构是:
a. a student can have different types of addresses ( 'HOME', 'VACATION' )
b. each address can have maximum of 4 lines
Run Code Online (Sandbox Code Playgroud)
我想知道如何解决和填充集合的不同组成部分。
我有这样的查询:
select w.rowid, w.waclogin
from tableA w, tableB wa, tableC a
where wa.alucod = a.alucod
and w.waclogin = wa.waclogin
and a.cpf = '31808013875'
and rownum <= 1;
Run Code Online (Sandbox Code Playgroud)
结果是:
ROWID WACLOGIN
AAA0CEAHSAABE07ABA 31808013875
Run Code Online (Sandbox Code Playgroud)
但是当我使用fetch(为了提高性能)时,返回的rowid是不同的:
select w.rowid, w.waclogin
from tableA w, tableB wa, tableC a
where wa.alucod = a.alucod
and w.waclogin = wa.waclogin
and a.cpf = '31808013875'
fetch first row only;
Run Code Online (Sandbox Code Playgroud)
结果是:
ROWID WACLOGIN
AAA0DMAHaAAA+ZcAAX 31808013875
Run Code Online (Sandbox Code Playgroud)
为什么要获取更改行号?对我来说,这没有道理。
使用提取时,返回的行ID来自表B,而不是表A。