oracle 10g R2数据库,用pl/sql developer 删除数据时,执行DELETE FROM TABLE1后就一直停在执行的状态,

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 10g R2数据库,用pl/sql developer 删除数据时,执行DELETE FROM TABLE1后就一直停在执行的状态,相关的知识,希望对你有一定的参考价值。

也不报错,不知是啥原因,请各位大侠指点迷津,小弟不胜感激。

DELETE删除时,需要获得表的某种锁,而这种锁正在被其他占用,例如有其他进程在向表插入、更改数据。因此DELETE时,就要去等待其他进程释放这个锁,然后得到这个锁。这段时间就要等待,并且PL/SQL DEVELOPER并处于卡着的状态,程序不能用,好像程序出问题了似的。追问

这位大侠,能不能说得清楚点呢,小弟新手,没有很好的理解你的意思。这句话是啥意思呢:“并且PL/SQL DEVELOPER并处于卡着的状态,程序不能用,好像程序出问题了似的。”
谢谢!

追答

我自己的情况是 PL/SQL DEV程序卡住了,动不了,也不能编辑SQL。等会或者操作完成后就会好。这个也会有不同吧

参考技术A 有可能另外一个session在对这张表作DML操作未commit使这个session处理时等待,也有可能你这张表太大了会删很久。 参考技术B 及时commit

过程中的 Pl/Sql Oracle 函数

【中文标题】过程中的 Pl/Sql Oracle 函数【英文标题】:Pl/Sql Oracle Function in a procedure 【发布时间】:2015-05-14 03:11:35 【问题描述】:

我需要创建一个需要更新学生情况的程序,但我需要使用一个函数,为获批的学生返回“A”,为未获批的学生返回“R”。在此之后,我需要使用从函数返回的“A”或“R”来更新“情况”字段。我已经有了这个功能,但我不知道如何制作这个程序。函数代码如下:

CREATE OR REPLACE FUNCTION check_grade(grade     IN NUMBER,
                                       frequency IN NUMBER) RETURN VARCHAR2 AS
   RESULT VARCHAR2(1) DEFAULT '';
BEGIN
   IF (grade >= 6) AND (frequency >= 0.75) THEN
      resultado := 'A';
   ELSE
      resultado := 'R';
   END IF;

   RETURN RESULT;
END;

【问题讨论】:

【参考方案1】:

我认为你把事情复杂化了。您可以在纯 SQL 中完成,而不是使用 PL/SQL 函数和过程。

您可以使用CASE表达式,例如:

测试 1

SQL> SELECT
  2  CASE
  3      WHEN &grade   >=6
  4      AND &frequency>=0.75
  5      THEN 'A'
  6      ELSE 'R'
  7    END
  8    FROM DUAL;
Enter value for grade:   10
old   3:     WHEN &grade   >=6
new   3:     WHEN   10   >=6
Enter value for frequency: 1
old   4:     AND &frequency>=0.75
new   4:     AND 1>=0.75

C
-
A

测试 2

SQL> SELECT
  2  CASE
  3      WHEN &grade   >=6
  4      AND &frequency>=0.75
  5      THEN 'A'
  6      ELSE 'R'
  7    END
  8    FROM DUAL;
Enter value for grade:   1
old   3:     WHEN &grade   >=6
new   3:     WHEN   1   >=6
Enter value for frequency: 0.5
old   4:     AND &frequency>=0.75
new   4:     AND 0.5>=0.75

C
-
R

因此,在 UPDATE 语句中使用相同的逻辑:

UPDATE table_name
SET situation = (
  CASE
    WHEN &grade   >=6
    AND &frequency>=0.75
    THEN 'A'
    ELSE 'R'
  END)
WHERE situation IS NOT NULL;

更新 OP 只想在一个过程中做:

create or replace procedure pr_update
 is
begin
update table_name 
   set Situation = check_grade(grade, frequency);
end;
/

在上述过程中,将实际的 table_name 放入更新语句中。等级和频率被认为是表的列名。

【讨论】:

我有一个新的疑问。现在我需要使用这个函数创建一个触发器。它不起作用....在每行插入 table_name 之前创建或替换触发器情况开始 select check_grade(grade, frequency) into : new.situation from dual;结束; @RenenGeraldo,请您提出一个关于触发器的新问题。【参考方案2】:

看看有没有帮助。

create or replace procedure pr_update(v_grade in number, v_frequency in number) is
update tab_name set Situation=check_grade(v_grade,v_frequency);
end;

【讨论】:

我觉得差不多是这样,但我需要在学生表中选择年级和频率的值。我怎样才能做到这一点?谢谢

以上是关于oracle 10g R2数据库,用pl/sql developer 删除数据时,执行DELETE FROM TABLE1后就一直停在执行的状态,的主要内容,如果未能解决你的问题,请参考以下文章

oracle 10g ,PL/SQL问题:ORA-12520:TNS:监听程序无法为请求的服务类型找到可用的处理程序,怎么办?如图

oracle 10g ,PL/SQL问题:ORA-12520:TNS:监听程序无法为请求的服务类型找到可用的处理程序,怎么办?如图

用jdbc 连oracle 出现异常,运行pl/sql能连上oracle ,连别人的oracle也可以,不知道我机器哪里的毛病,求

jdbc是啥,和PL/SQL developer是啥关系?

oracle 10g 客户端连接数据库 出现ora-12154 错误

Oracle10g 64位安装包可以在2008R2下用