오라클 호출 저장 프로시저 내부 선택
저는 쿼리(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
'it-source' 카테고리의 다른 글
SQL 서버 저장 프로시저를 버전 제어하는 가장 좋은 방법은 무엇입니까? (0) | 2023.06.25 |
---|---|
npm 피어 종속성을 자동으로 설치하는 방법은 무엇입니까? (0) | 2023.06.25 |
C# csv를 xls로 변환(기존 csv 파일 사용) (0) | 2023.06.25 |
기본 웹 브라우저에서 URL 열기 (0) | 2023.06.25 |
C#에서 MongoDB Bson 문서를 유효한 JSON으로 변환 (0) | 2023.06.25 |