2014-12-12 4 views
0

PostgreSQL의 저장 프로 시저가 일정에 완벽하게 작동합니다. 그러나 'x'일 후에 제대로 작동하지 않습니다. 'x'는 우리가 알아챈 한 3에서 90 사이의 불확실한 변수입니다. 일단 테이블을 '나누어서'테이블을 잘못 채우면 다음에 수동으로 실행될 때까지 향후 예약 된 실행에서이 방식으로 계속 작동합니다.PostgreSQL 저장 프로 시저가 갑자기 작동을 멈 춥니 다

저는 PostgreSQL 9.3.4를 실행하고 있습니다. 나는 SP에 대한 코드를 게시 할 수 있지만 뭔가 잘못 될 때까지 확실히 작동합니다.

어떤 아이디어 일 수 있으며 어떻게 해결할 수 있습니까?

코드는 :

CREATE OR REPLACE FUNCTION public.sp_oppscreated() 
RETURNS integer 
LANGUAGE plpgsql 
AS $function$ 
BEGIN 

DROP TABLE IF EXISTS bec_oppscreated CASCADE; 

CREATE TABLE bec_oppscreated WITH (OIDS=TRUE) 
AS 

SELECT opportunity.id AS oppid, 
    SPLIT_PART(user2.username, '@', 1) AS username, 
    recordtype.name AS opptype, 
    opportunity.stagename AS stage, 
    opportunity.createddate AS createddate, 
    opportunity.ve__c AS ve, 
    opportunity.amount AS oppamount, 
    opportunity.lab AS lab, 

    CASE 
      WHEN (recordtype.name = 'Proposal' AND opportunity.ve__c <> 'V') THEN opportunity.amount 
      WHEN (recordtype.name = 'Proposal' AND opportunity.ve__c = 'V' AND opportunity.lab <> 0 AND opportunity.lab IS NOT NULL) THEN opportunity.lab 
      ELSE 0 
    END AS amount_prp_created, 
    CASE 
      WHEN (recordtype.name = 'Amendment' AND opportunity.ve__c <> 'V') THEN opportunity.amount 
      WHEN (recordtype.name = 'Amendment' AND opportunity.ve__c = 'V' AND opportunity.lab <> 0 AND opportunity.lab IS NOT NULL) THEN opportunity.lab 
      ELSE 0 
    END AS amount_amd_created, 
    CASE 
      WHEN (opportunity.ve__c <> 'V') THEN opportunity.amount 
      WHEN (opportunity.ve__c = 'V' AND opportunity.lab <> 0 AND opportunity.lab IS NOT NULL) THEN opportunity.lab 
      ELSE 0 
    END AS amount_cons_created, 

    CASE WHEN (opportunity.ve__c = 'A') THEN opportunity.amount ELSE 0 END AS amount_A_created, 
    CASE WHEN (opportunity.ve__c = 'C') THEN opportunity.amount ELSE 0 END AS amount_C_created, 
    CASE WHEN (opportunity.ve__c = 'D') THEN opportunity.amount ELSE 0 END AS amount_D_created, 
    CASE WHEN (opportunity.ve__c = 'I') THEN opportunity.amount ELSE 0 END AS amount_I_created, 
    CASE WHEN (opportunity.ve__c = 'L') THEN opportunity.amount ELSE 0 END AS amount_L_created, 
    CASE WHEN (opportunity.ve__c = 'M') THEN opportunity.amount ELSE 0 END AS amount_M_created, 
    CASE WHEN (opportunity.ve__c = 'P') THEN opportunity.amount ELSE 0 END AS amount_P_created, 
    CASE WHEN (opportunity.ve__c = 'V') THEN opportunity.amount ELSE 0 END AS amount_V_created, 
    opportunity.amount AS amount_created, 

    CASE 
      WHEN (recordtype.name = 'Proposal' AND opportunity.ve__c <> 'V') THEN 1 
      WHEN (recordtype.name = 'Proposal' AND opportunity.ve__c = 'V' AND opportunity.lab <> 0 AND opportunity.lab IS NOT NULL) THEN 1 
      ELSE 0 
    END AS count_prp_created, 
    CASE 
      WHEN (recordtype.name = 'Amendment' AND opportunity.ve__c <> 'V') THEN 1 
      WHEN (recordtype.name = 'Amendment' AND opportunity.ve__c = 'V' AND opportunity.lab <> 0 AND opportunity.lab IS NOT NULL) THEN 1 
      ELSE 0 
    END AS count_amd_created, 
    CASE 
      WHEN (opportunity.ve__c <> 'V') THEN 1 
      WHEN (opportunity.ve__c = 'V' AND opportunity.lab <> 0 AND opportunity.lab IS NOT NULL) THEN 1 
      ELSE 0 
    END AS count_cons_created, 

    CASE WHEN (opportunity.ve__c = 'A') THEN 1 ELSE 0 END AS count_A_created, 
    CASE WHEN (opportunity.ve__c = 'C') THEN 1 ELSE 0 END AS count_C_created, 
    CASE WHEN (opportunity.ve__c = 'D') THEN 1 ELSE 0 END AS count_D_created, 
    CASE WHEN (opportunity.ve__c = 'I') THEN 1 ELSE 0 END AS count_I_created, 
    CASE WHEN (opportunity.ve__c = 'L') THEN 1 ELSE 0 END AS count_L_created, 
    CASE WHEN (opportunity.ve__c = 'M') THEN 1 ELSE 0 END AS count_M_created, 
    CASE WHEN (opportunity.ve__c = 'P') THEN 1 ELSE 0 END AS count_P_created, 
    CASE WHEN (opportunity.ve__c = 'V') THEN 1 ELSE 0 END AS count_V_created, 
    1 AS count_created 
FROM opportunity 
LEFT JOIN user2 ON opportunity.ownerid = user2.id 
LEFT JOIN recordtype ON opportunity.recordtypeid = recordtype.id 
WHERE opportunity.isdeleted = FALSE 
AND opportunity.createddate > '2007-11-02 03:59:59' 
AND opportunity.lastmodifieddate > '2010-01-11 04:59:59' 
ORDER BY username ASC; 

GRANT SELECT 
ON bec_oppscreated 
TO public; 
RETURN 0; 

EXCEPTION WHEN OTHERS THEN 
BEGIN 
RAISE notice 'The transaction is in an uncommittable state. ' 
      'Transaction was rolled back'; 

RAISE notice '% %', SQLERRM, SQLSTATE; 
RETURN -1; 
END; 

END; 
$function$ 
+2

몇 가지 코드를 공유 할 수 있습니까? – Mureinik

+0

코드 블록이 추가되었습니다. – Dezzie

+0

"일정에 완벽하게 적용됩니다"를 정의하십시오. "일정"은 무엇입니까? –

답변

0

문제는 크론 관련이있다. 어떤 이유를 들어

는 포스트 그레스 사용자의 크론 결과에서 실행되는 모든 명령 /bin/bash --version 포함 "명령을 찾을 수 없습니다"그래서 /bin/bash 또는 /bin/sh에 액세스 할 수있는 능력을 잃게됩니다. /bin/bash: postgres: command not found

이 심지어 SHELL =/빈/bash는 발생 :/var에의

*/5 * * * * postgres /bin/bash --version >> /var/log/mylog 2>&1

항목은 /이 mylog/로그인합니다.

로그를 모니터링 할 때마다 다음 작업을 수행했습니다. - postgres 사용자 crontab에 PATH 문이 추가되었습니다. 고치지 않았어. - 다시 시작 /etc/init.d/crond. 고치지 않았어. - 루트 사용자 crontab로 명령을 이동했습니다. 고치지 않았어. - cron.hob로 cronjob을 이동했습니다. 결정된!

관련 문제