it-source

오라클 호출 저장 프로시저 내부 선택

criticalcode 2023. 6. 25. 20:11
반응형

오라클 호출 저장 프로시저 내부 선택

저는 쿼리(SELECT)를 작성하고 있으며 이 쿼리의 결과를 표에 삽입해야 합니다.삽입하기 전에 몇 가지 확인할 사항이 있으며, 모든 열이 유효하면 삽입하겠습니다.

검사는 저장 프로시저에서 수행됩니다.같은 절차가 다른 곳에서도 사용됩니다.그래서 같은 절차로 검사를 할 생각입니다.

이 절차는 검사를 수행하고 값을 삽입하는 데 문제가 없습니다.

SELECT에서 절차를 호출하려고 했지만 작동하지 않습니다.

SELECT field1, field2, myproc(field1, field2)

from MYTABLE.

이런 종류의 코드는 작동하지 않습니다.

커서를 사용하여 수행할 수 있다고 생각하지만 커서는 피하고 싶습니다.저는 가장 쉬운 해결책을 찾고 있습니다.

아무도, 아무 생각 없어요?

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>

함수는 테이블에 삽입할 값을 반환해야 합니다."salary okay"와 같은 의미 없는 문구를 반환할 수 없습니다.또한 두 열의 유효성을 검사하려면 두 열의 관계가 있고 동일한 저장 프로시저를 사용하여 두 열의 유효성을 검사하더라도 각 열에 대해 별도의 함수가 필요합니다.DEMITLISTIC 키워드에 적합합니다.

시험은 이렇습니다: 배관공들은 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> insert into emp
  2      (empno
  3      , ename
  4      , job
  5      , deptno
  6      , sal )
  7  select
  8      emp_seq.nextval
  9      , 'HALL'
 10      , 'MANAGER'
 11      , 60
 12      , validate_salary(5000, 'MANAGER')
 13  from dual
 14  /

1 row created.

SQL>

이 작업에는 Hurled 예외가 매우 중요합니다.급여가 유효하다면 이상한 내용을 작성할 수 없으며 SQL 문에 논리를 삽입할 수 없습니다.따라서 저장 프로시저가 예외를 발생시키지 않고 일부 윔피 오류 상태를 반환하는 경우 래핑 함수는 출력을 해석하고 자체 예외를 던져야 합니다.

SELECT 문에서는 저장 프로시저를 사용할 수 없습니다.그것을 위한 기능을 사용할 수 있습니다.

SP에서 insert를 호출하는 것으로 알고 있으므로 함수 본문에서 INSERT/UPDATE를 사용할 수 없다는 점을 고려하십시오.그러나 몇 가지 검사가 필요한 경우 해당 검사를 수행할 기능을 사용할 수 있으며 선택 문에 해당 기능을 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/2865149/oracle-call-stored-procedure-inside-select

반응형