일부 매개 변수를 사용하여 webservice를 호출하고 응답을 구문 분석 한 다음 값을 반환하는 PL/SQL 함수를 작성했습니다. 그것은 아주 잘 작동합니다.PL/SQL 함수의 INSERT 문
그러나 응답이 느려질 수 있습니다. 매개 변수는 일반적으로 모든 가능한 값의 매우 작은 하위 집합이므로 테이블에 응답을 캐시 할 생각이 있습니다. 기능은 내가이 기능을 시도한 다음
CREATE OR REPLACE FUNCTION myfct(p1 IN VARCHAR2, p2 IN VARCHAR2)
RETURN VARCHAR2
IS
cache_hit NUMBER ;
res VARCHAR2(200) ;
BEGIN
SELECT COUNT(*) INTO cache_hit FROM MYCACHE WHERE param1 = p1 AND param2 = p2 ;
IF(cache_hit = 1)
THEN
SELECT MYCACHE.result INTO res FROM MYCACHE WHERE param1 = p1 AND param2 = p2 ;
RETURN res ;
END IF ;
-- complex operations
res := p1 || p2 ;
INSERT INTO MYCACHE(param1, param2, result) VALUES(p1, p2, res) ;
RETURN res ;
END ;
과 같습니다
ORA-14551: cannot perform a DML operation inside a query
절차에 DML 부분을 포장하려고 : 나는 오류가 발생했습니다
SELECT myfct('ABC', 'DEF') FROM DUAL ;
을 함수에서이 프로 시저를 호출하면 도움이되지 않습니다.
나는 PRAGMA AUTONOMOUS_TRANSACTION와 해결 방법 발견하고 COMMIT :
CREATE OR REPLACE FUNCTION myfct(p1 IN VARCHAR2, p2 IN VARCHAR2)
RETURN VARCHAR2
IS
PRAGMA AUTONOMOUS_TRANSACTION;
cache_hit NUMBER ;
res VARCHAR2(200) ;
BEGIN
SELECT COUNT(*) INTO cache_hit FROM MYCACHE WHERE param1 = p1 AND param2 = p2 ;
IF(cache_hit = 1)
THEN
SELECT MYCACHE.result INTO res FROM MYCACHE WHERE param1 = p1 AND param2 = p2 ;
RETURN res ;
END IF ;
-- complex operations
res := p1 || p2 ;
INSERT INTO MYCACHE(param1, param2, result) VALUES(p1, p2, res) ;
COMMIT ;
RETURN res ;
END ;
을하지만 정말 좋은 생각입니다 있는지 궁금해. 이 해결 방법을 언급하는 사람들은 이유를 정확하게 말하지 않고도 위험 할 수 있다고 말했습니다.
내 기능은 PRAGMA AUTONOMOUS_TRANSACTION에 대한 좋은 사용의 예입니까, 아니면 내가 원하는 것을하기위한 더 좋고 안전한 방법입니까?
PL/SQL에서 함수를 사용하여 select를 사용하면 결과를 일부 전역 콜렉션에 저장 한 후 테이블에 값을 삽입하는 것이 더 나을 수 있습니다. – SkyWalker
나는 그것에 대해 생각했지만 모든 가능한 조합으로, 우리는 몇 백만 행을 저장할 것이고, 우리는 ~ 10 000 combinaisons만을 정기적으로 사용할 계획이다. 캐시 테이블이있는이 하이브리드 솔루션을 사용하면 모든 조합에 응답 할 수 있지만 가장 적절한 조합 만 저장할 수 있습니다. –
결과를 최신 상태로 유지할 수 있습니까? 복잡한 선택의 기본 데이터가 변경되면 어떻게됩니까? 어쩌면 당신은'materialized view '로 당신의 퍼포먼스 문제를 해결할 수 있을까? –