标签: plsql

如果删除的行具有未超过一年的datefin字段,我创建了一个触发器来引发错误

这是我的代码:

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'时出错

oracle plsql database-trigger

0
推荐指数
1
解决办法
38
查看次数

存储过程在从源视图更新表时存在性能问题

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)

oracle performance plsql

0
推荐指数
1
解决办法
56
查看次数

如何避免oracle中的无效标识符

我需要创建一个视图,但我得到此错误"无效的标识符".问题是我尝试访问一个不存在的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;

sql oracle plsql

0
推荐指数
1
解决办法
84
查看次数

执行立即执行立即执行的pl/sql

我有一个执行立即的查询字符串.

我怎么能执行立即这个PL/SQL?

query string ='执行立即选择....';

想要这样做: Execute immediate 'query string';

这变成了: Execute immediate 'Execute immediate select ....;';

你知道我怎么能这样做?

oracle plsql dynamic-sql

0
推荐指数
1
解决办法
197
查看次数

使用COUNT(*)时如何获取NO_DATA_FOUND异常?

我试图确定为什么我的异常输出没有正确返回.

这适用于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".

sql oracle plsql exception

0
推荐指数
1
解决办法
151
查看次数

PLSQL:在plsql保存的过程中处理临时表是个好主意吗?

打算进行讨论。

我有一个结果表,它是由一个稍微复杂的查询(几个Joins和WHERE子句)生成的,随着我们的进行,我将在过程中多次操作/引用。

我唯一能想到的就是将查询结果存储在一个表中,并在过程结束时删除该表。这是可行的选择吗?有什么缺点?更好的选择?

oracle plsql

0
推荐指数
1
解决办法
54
查看次数

在不放置所有参数的情况下调用oracle过程

我正在使用看起来像这样的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)

仅将我需要的供应参数和所有其他参数设置为默认值。

oracle plsql

0
推荐指数
1
解决办法
70
查看次数

如何查找PL SQL包中受影响的表?

我必须找出现有的PL SQL包中要插入或更新到其中的表的列表。我开始分析该软件包。令人担忧的是,程序包代码在数千行代码中运行,并依次调用许多其他程序包。另外,代码不是我写的。由于它是开发环境,因此无法运行AWR报告。

启动事务后,是否有办法将插入/更新的表插入其中?是否可以编写触发器来满足我的要求?

sql oracle plsql stored-procedures

0
推荐指数
1
解决办法
102
查看次数

PL / SQL中的Oracle多级集合

我有一个如下定义的多级集合。

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)

我想知道如何解决和填充集合的不同组成部分。

oracle collections plsql

0
推荐指数
1
解决办法
55
查看次数

为什么Oracle用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'
   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。

来自3个表格的行ID

oracle plsql

0
推荐指数
1
解决办法
41
查看次数