Sql 选择内部的oracle调用存储过程

Sql 选择内部的oracle调用存储过程,sql,oracle,stored-procedures,plsql,insert,Sql,Oracle,Stored Procedures,Plsql,Insert,我正在处理一个查询(SELECT),我需要将这个查询的结果插入表中。 在进行插入之前,我要做一些检查,如果所有列都有效,我将进行插入 检查在存储过程中完成。其他地方也使用同样的程序。 所以我想用同样的程序来做我的检查 该程序进行检查,并插入所有正常值 我试图在SELECT中调用该过程,但它不起作用 SELECT field1, field2, myproc(field1, field2) from MYTABLE. 这种代码不起作用 SELECT field1, field2, myproc

我正在处理一个查询(SELECT),我需要将这个查询的结果插入表中。 在进行插入之前,我要做一些检查,如果所有列都有效,我将进行插入

检查在存储过程中完成。其他地方也使用同样的程序。 所以我想用同样的程序来做我的检查

该程序进行检查,并插入所有正常值

我试图在SELECT中调用该过程,但它不起作用

SELECT field1, field2, myproc(field1, field2)

from MYTABLE.
这种代码不起作用

SELECT field1, field2, myproc(field1, field2)

from MYTABLE.
我认为可以使用游标来完成,但我希望避免使用游标。 我在寻找最简单的解决办法


有人知道吗?

您不能在SELECT语句中使用存储过程。 您可以使用函数来实现这一点

据我所知,您正在SP中调用insert,因此请考虑您可以在函数体中使用insert/UPDATE。但如果您需要执行一些检查,您可以使用将执行该检查的函数,并在select语句中使用该函数。

使用PL/SQL循环:

BEGIN
   FOR c IN (SELECT field1, field2 FROM mytable) LOOP
       my_proc(c.field1, c.field2);
   END LOOP;
END;

SQL只能在投影中使用函数:它需要返回值的东西。因此,您必须编写一些函数。这是个坏消息。好消息是,您可以重用存储过程中的所有投资

这里有一个执行完全公正的商业规则的程序:只有经理才能有高薪

SQL> create or replace procedure salary_rule
  2      ( p_sal in emp.sal%type
  3        , p_job in emp.job%type)
  4  is
  5      x_sal exception;
  6  begin
  7      if p_sal > 4999 and p_job != 'MANAGER' then
  8          raise x_sal;
  9      end if;
 10  exception
 11      when x_sal then
 12          raise_application_error(-20000, 'Only managers can earn that much!');
 13  end salary_rule;
 14  /

Procedure created.

SQL>
因为这是一个过程,我们不能在SELECT语句中使用它;我们需要把它包装成一个函数。此函数只调用存储过程。它返回输入参数P_SAL。换句话说,如果工资是有效的(根据规则),它将被返回。否则,函数将重新抛出存储过程的异常

SQL> create or replace function validate_salary
  2      ( p_sal in emp.sal%type
  3        , p_job in emp.job%type)
  4      return emp.sal%type
  5  is
  6  begin
  7      salary_rule(p_sal, p_job);
  8      return p_sal;
  9  end validate_salary;
 10  /

Function created.

SQL>
函数必须返回一个我们想要插入到表中的值。它不能返回一些毫无意义的短语,如“薪水没问题”。此外,如果我们想验证两个列,我们需要为每个列使用单独的函数,即使它们之间存在关系,并且我们使用相同的存储过程来验证它们。很好地使用了DETERMINISTIC关键字

这是一个考验:水管工赚不到5000英镑

SQL> insert into emp
  2      (empno
  3      , ename
  4      , job
  5      , deptno
  6      , sal )
  7  select
  8      emp_seq.nextval
  9      , 'HALL'
 10      , 'PLUMBER'
 11      , 60
 12      , validate_salary(5000, 'PLUMBER')
 13  from dual
 14  /
    , validate_salary(5000, 'PLUMBER')
      *
ERROR at line 12:
ORA-20000: Only managers can earn that much!
ORA-06512: at "APC.SALARY_RULE", line 12
ORA-06512: at "APC.VALIDATE_SALARY", line 7


SQL>
。。。但管理者可以(因为这是他们应得的):


请注意,抛出的异常对此工作至关重要。我们不能写一些奇怪的东西,如果工资是有效的,那么在SQL语句中插入逻辑。因此,如果存储过程不引发异常,而是返回一些弱错误状态,包装函数将不得不解释输出并抛出自己的异常。

是的,这将是最终的解决方案,但我希望使用现有SP,因为它是大型项目的一部分,我不想使用新函数。这将更难实现。实际上,我的存储过程执行插入操作。因此,我无法在select中使用insert。