Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 存储过程异常行为_Oracle_Stored Procedures_Plsql_Oracle12c - Fatal编程技术网

Oracle 存储过程异常行为

Oracle 存储过程异常行为,oracle,stored-procedures,plsql,oracle12c,Oracle,Stored Procedures,Plsql,Oracle12c,我有一个疑问 (SELECT ... FROM T2 WHERE x=1) select返回插入T1的元组列表。 再见,很好 由于“1”可能会使用参数更改存储过程,因此在此处执行此操作 BEGIN INSERT INTO T1 (SELECT ... FROM T2 WHERE x=value) END; 该过程在T3上插入后由触发器调用 在Oracle 12c上运行select将在T1中插入两行。也可以使用不同的值而不是“1”运行 调用过程时,尽管使用不同的

我有一个疑问

(SELECT ...
FROM T2
WHERE x=1)
select返回插入T1的元组列表。 再见,很好

由于“1”可能会使用参数更改存储过程,因此在此处执行此操作

BEGIN
    INSERT INTO T1
    (SELECT ...
    FROM T2
    WHERE x=value)
END;
该过程在T3上插入后由触发器调用

在Oracle 12c上运行select将在T1中插入两行。也可以使用不同的值而不是“1”运行

调用过程时,尽管使用不同的参数调用,但始终插入相同数量的行和相同的值。看起来它是用同一个参数执行的,而不是。 该过程的执行时间大约是直接查询insert语句的18倍

以上代码可能无法编译,只是为了演示


你知道为什么程序执行时间这么长,为什么它显然在做其他事情吗?

阅读你的描述,听起来好像你误用了程序的参数。这里有一个例子说明了我的意思

让我们创建一个表(就像T1一样)和一个接受参数并向该表中执行insert的过程

SQL> create table test (deptno number, ename varchar2(10));

Table created.

SQL>
SQL> create or replace procedure p_test (deptno in number)
  2  is
  3  begin
  4    insert into test (deptno, ename)
  5    select deptno, ename
  6    from emp
  7    where deptno = deptno;
  8  end;
  9  /

Procedure created.
我想插入在第10部门工作的员工:

SQL> select deptno, ename
  2  from emp
  3  where deptno = 10;

    DEPTNO ENAME
---------- ----------
        10 CLARK
        10 KING
        10 MILLER
精细;我希望插入3行。让我们调用程序,然后:

SQL> exec p_test (10);

PL/SQL procedure successfully completed.
结果:

SQL> select * From test;

    DEPTNO ENAME
---------- ----------
        20 SMITH
        30 ALLEN
        30 WARD
        20 JONES
        30 MARTIN
        30 BLAKE
        10 CLARK
        20 SCOTT
        10 KING
        30 TURNER
        20 ADAMS
        30 JAMES
        20 FORD
        10 MILLER

14 rows selected.

SQL>
哇!不完全是我想要的

罪魁祸首是:

7    where deptno = deptno;
因为我对参数的命名与列名完全相同,所以Oracle知道此条件始终为真(好像
其中1=1
),并插入它在
EMP
表中找到的所有行,因为不涉及其他条件

怎么办?重命名参数并重复测试:

SQL> create or replace procedure p_test (p_deptno in number)     --> here
  2  is
  3  begin
  4    insert into test (deptno, ename)
  5    select deptno, ename
  6    from emp
  7    where deptno = p_deptno;                                  --> here
  8  end;
  9  /

Procedure created.

SQL> truncate table test;

Table truncated.

SQL> exec p_test (10);

PL/SQL procedure successfully completed.

SQL> select * From test;

    DEPTNO ENAME
---------- ----------
        10 CLARK
        10 KING
        10 MILLER

SQL>
好多了,不是吗


如果你就是这么做的,现在你知道怎么解决了。如果没有,请发布一个和我一样的例子,这样我们就可以看到你做了什么,以及Oracle如何应对



到目前为止。。。谁知道呢?信息太少,无法计算。跟踪会话并使用TKPROF,您将确切知道发生了什么。

这不是一个可重复的最小示例。请参阅:。我们无法猜测您的实际代码是什么。不,不要发布当前的全部代码。创建一些一次性表(包括此处的CREATETABLE语句),在这些表上创建触发器(包括此处的触发器代码),创建显示问题的小过程(包括此处的过程代码)。然后写一个脚本调用你的过程(包括在你的问题中),并解释你期望的结果。你的措辞也应该精确。你写的大多数句子都没有意义。Select语句不返回“元组列表”1'可能会更改存储过程--什么?否,运行select不会插入任何内容。没有查询insert语句这样的事情。