oracle 프로시저가 정수를 반환합니다.
오라클에서는 삭제 결과에 따라 정수를 반환하는 삭제 저장 프로시저를 만들고 싶습니다.
이것이 제가 지금까지 가지고 있는 것입니다.
create or replace
PROCEDURE Testing
(
iKey IN VARCHAR2
)
AS
BEGIN
delete from MyTable WHERE
TheKey = iKey;
END Testing;
RETURNES 정수를 넣으려고 했지만 저장 프로시저가 컴파일되지 않습니다.
프로시저는 값을 반환하지 않습니다.함수는 값을 반환하지만 함수에서 DML을 수행해서는 안 됩니다. 그렇지 않으면 SQL 문에서 함수를 참조하는 것과 같은 작업을 수행할 수 없습니다. 일반적으로 DBA는 사용자가 일관되게 계산을 수행할 수 있도록 모든 함수에 대한 읽기 전용 사용자 액세스 권한을 부여하기를 원하기 때문에 권한 부여를 혼동합니다.
OUT 파라미터를 절차에 추가하여 상태를 반환할 수 있습니다."성공"이 하나 이상의 행이 업데이트되었음을 의미하는 경우, SQL%ROWCOUNT를 사용하여 이전 SQL 문에 의해 수정된 행 수를 카운트하고 이를 사용하여 반환 매개 변수를 채울 수 있습니다.
CREATE OR REPLACE PROCEDURE test_proc (
p_iKey IN VARCHAR2,
p_retVal OUT INTEGER
)
AS
BEGIN
DELETE FROM myTable
WHERE theKey = p_iKey;
IF( SQL%ROWCOUNT >= 1 )
THEN
p_retVal := 1;
ELSE
p_retVal := 0;
END IF;
END test_proc;
물론 일반적인 코드 명확성의 관점에서 볼 때 상태 코드를 반환하려는 것으로 보이는 OUT 매개 변수에 대해서는 의문이 듭니다.일반적으로 성공을 가정하고 오류가 발생할 경우 예외를 던지는 것이 훨씬 좋습니다.
저장 프로시저를 사용하여 결과를 반환할 수 있습니다.
CREATE OR REPLACE PROCEDURE testing (iKey IN VARCHAR2, oRes OUT NUMBER)
AS
BEGIN
DELETE FROM MyTable
WHERE TheKey = iKey;
oRes := SQL%ROWCOUNT;
END;
절차를 호출하려면 다음과 같은 방법을 사용합니다.
DECLARE
pRes NUMBER;
BEGIN
testing ('myspecialkey', pRes);
DBMS_OUTPUT.put_line (pRes);
END;
함수와 암시적 SQL 커서를 사용하여 삭제된 행 수 결정
create or replace
FUNCTION Testing
(
iKey IN VARCHAR2
) RETURN INTEGER
AS
BEGIN
delete from MyTable WHERE
TheKey = iKey;
RETURN SQL%ROWCOUNT;
END Testing;
그러면 되겠군요.
대신 함수를 찾고 있을 수 있습니다.
FUNCTION TESTING (iKEY IN VARCHAR2) RETURN NUMBER
IS
v_count NUMBER;
yourNumber NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count
FROM MyTable
WHERE TheKey = iKey;
IF v_count > 0
THEN
DELETE FROM MyTable
WHERE TheKey = iKey;
SELECT COUNT(*) INTO v_count
FROM MyTable
WHERE TheKey = iKey;
IF (v_count = 0)
THEN
yourNumber := 1; --means successful deletion
END IF;
ELSE
yourNumber := 0; --means no items to delete
END IF;
return yourNumber;
EXCEPTION
WHEN OTHERS THEN
RETURN -1; --means error was encountered
END TESTING;
참고: 제가 일하는 곳에서는 일반적으로 sql 패키지 안에 함수를 넣습니다.
그SQL%ROWCOUNT다른 DML이 실행된 경우 DML의 값이 재설정된 직후에만 값을 반환합니다.
루프에서 삭제를 실행하면서 문제를 해결하기 위해 dml 뒤에 다음 명령을 실행했습니다.
row_count := row_count + SQL%ROWCOUNT;
선언하고 초기화해야 합니다.row_count := 0;
언급URL : https://stackoverflow.com/questions/262338/oracle-procedure-returns-integer
'programing' 카테고리의 다른 글
| 너비, 내부 너비 및 외부 너비, 높이, 내부의 차이높이 및 외부높이(jQuery) (0) | 2023.07.31 |
|---|---|
| 항법 컨트롤러의 투명 모달 뷰 (0) | 2023.07.31 |
| jQuery append() - 추가된 요소 반환 (0) | 2023.07.31 |
| 페이지 다시 로드 없이 Ajax 성공 후 URL 변경 방법 (0) | 2023.07.31 |
| 템플릿 엔진을 사용하지 않고 부팅 (0) | 2023.07.31 |