2015-12-08 3 views
0

Je rencontre des problèmes lors de la création d'une procédure qui effectue une opération. Fondamentalement, j'ai deux tables, l'un est le tableau de revenu un autre est RECURRINGTRANSACTION. Je prévois de créer un travail dans Oracle 11g qui exécutent une procédure quotidienne. la procédure aura une date de début, une date de fin et un nombre d'occurrences donc ma procédure devrait vérifier si la date de début est la date du jour et le nombre d'occurrences! = 0 alors elle devrait insérer une ligne dans ma 1ère table qui est la table INCOME. Voici mes descriptions et données de table. enter image description hereProblèmes de création d'une procédure pl/sql avec% ROWTYPE

enter image description here

enter image description here

create or replace procedure recurTransDaily(currTransID in number) 
is 

    type r_currentTransRow is record(
    RECTRANSACTIONID RECURRINGTRANSACTION.RECTRANSACTIONID%TYPE, 
    AMOUNT RECURRINGTRANSACTION.AMOUNT%TYPE, 
    DESCRIPTION RECURRINGTRANSACTION.DESCRIPTION%TYPE, 
    ISEXPENSE RECURRINGTRANSACTION.ISEXPENSE%TYPE, 
    ISINCOME RECURRINGTRANSACTION.ISINCOME%TYPE, 
    NOOFOCCURENSES RECURRINGTRANSACTION.NOOFOCCURENSES%TYPE, 
    TRANSACTIONDATE RECURRINGTRANSACTION.TRANSACTIONDATE%TYPE, 
    TRANSSACTIONENDDATE RECURRINGTRANSACTION.TRANSSACTIONENDDATE%TYPE, 
    CATEGORYID RECURRINGTRANSACTION.CATEGORYID%TYPE, 
    PAYEEID RECURRINGTRANSACTION.PAYEEID%TYPE, 
    RECURRINGTRANSACTIONTYPE  RECURRINGTRANSACTION.RECURRINGTRANSACTIONTYPE%TYPE, 
    PERSONID RECURRINGTRANSACTION.PERSONID%TYPE); 


BEGIN 
    select * 
    into r_currentTransRow 
    from RECURRINGTRANSACTION where RECTRANSACTIONID=currTransID; 

if to_char(r_currentTransRow.TRANSACTIONDATE,'MM-dd- yyyy')=to_char(sysdate,'MM-dd-yyyy') then 
-- insert a record into income table 
    insert into income(AMOUNT,DESCRIPTION,TRANSACTIONDATE,CATEGORYID,PAYEEID,PERSONID) values 
    (r_currentTransRow.AMOUNT,r_currentTransRow.DESCRIPTION,r_currentTransRow.TRANSACTIONDATE, 
    r_currentTransRow.CATEGORYID,r_currentTransRow.PAYEEID,r_currentTransRow.PERSONID); 

    -- update the present RECURRINGTRANSACTION row with TRANSACTIONDATE=sysdate+1 and NOOFOCCURENSES=NOOFOCCURENSES-1 
    update RECURRINGTRANSACTION set RECURRINGTRANSACTION.TRANSACTIONDATE=to_char(sysdate+1,'MM-dd-yyyy'), 
     RECURRINGTRANSACTION.NOOFOCCURENSES=r_currentTransRow.NOOFOCCURENSES-1 
      WHERE RECURRINGTRANSACTION.RECTRANSACTIONID=r_currentTransRow.RECTRANSACTIONID; 
    commit; 
end if; 
END; 

Si j'exécute le script ci-dessus, il me donne les erreurs ci-dessous. Je suis nouveau à PL/SQL. Quelqu'un peut-il expliquer la signification des erreurs et la façon de les résoudre enter image description here

Répondre

2

/* Bonjour, vous pouvez essayer ci-dessous extrait. Puisque je n'ai pas d'espace de travail avec moi maintenant, je peux donc contenir une erreur de syntaxe. Faites-moi savoir si cela aide. */

CREATE OR REPLACE PROCEDURE recurTransDaily(
    currTransID IN NUMBER) 
IS 
type r_currentTransRowrcrd 
IS 
    record 
    (
    RECTRANSACTIONID RECURRINGTRANSACTION.RECTRANSACTIONID%TYPE, 
    AMOUNT RECURRINGTRANSACTION.AMOUNT%TYPE, 
    DESCRIPTION RECURRINGTRANSACTION.DESCRIPTION%TYPE, 
    ISEXPENSE RECURRINGTRANSACTION.ISEXPENSE%TYPE, 
    ISINCOME RECURRINGTRANSACTION.ISINCOME%TYPE, 
    NOOFOCCURENSES RECURRINGTRANSACTION.NOOFOCCURENSES%TYPE, 
    TRANSACTIONDATE RECURRINGTRANSACTION.TRANSACTIONDATE%TYPE, 
    TRANSSACTIONENDDATE RECURRINGTRANSACTION.TRANSSACTIONENDDATE%TYPE, 
    CATEGORYID RECURRINGTRANSACTION.CATEGORYID%TYPE, 
    PAYEEID RECURRINGTRANSACTION.PAYEEID%TYPE, 
    RECURRINGTRANSACTIONTYPE RECURRINGTRANSACTION.RECURRINGTRANSACTIONTYPE%TYPE, 
    PERSONID RECURRINGTRANSACTION.PERSONID%TYPE); 
TYPE lv_tab 
IS 
    TABLE OF r_currentTransRowrcrd; 
    r_currentTransRow lv_tab; 
BEGIN 

    EXECUTE IMMEDIATE 'ALTER SESSION set nls_timestamp_format = ''DD-MON-YY HH24:MI:SS.FF6'''; 
    EXECUTE IMMEDIATE 'ALTER SESSION set nls_date_format = ''DD-MON-YY'''; 

    SELECT * BULK COLLECT 
    INTO r_currentTransRow 
    FROM RECURRINGTRANSACTION 
    WHERE RECTRANSACTIONID =currTransID; 

    FOR I IN r_currentTransRow.FIRST..r_currentTransRow.LAST 

    LOOP 
    IF TO_CHAR(TO_TIMESTAMP(r_currentTransRow(i).TRANSACTIONDATE,'DD-MON-YY HH24:MI:SS.FF6'),'DD-MON-YY') = to_char(sysdate,'DD-MON-YY') THEN 
     -- insert a record into income table 

     INSERT 
     INTO income 
     (
      AMOUNT, 
      DESCRIPTION, 
      TRANSACTIONDATE, 
      CATEGORYID, 
      PAYEEID, 
      PERSONID 
     ) 
     VALUES 
     (
      r_currentTransRow(i).AMOUNT, 
      r_currentTransRow(i).DESCRIPTION, 
      r_currentTransRow(i).TRANSACTIONDATE, 
      r_currentTransRow(i).CATEGORYID, 
      r_currentTransRow(i).PAYEEID, 
      r_currentTransRow(i).PERSONID 
     ); 
     -- update the present RECURRINGTRANSACTION row with TRANSACTIONDATE=sysdate+1 and NOOFOCCURENSES=NOOFOCCURENSES-1 
     UPDATE RECURRINGTRANSACTION 
     SET RECURRINGTRANSACTION.TRANSACTIONDATE =SYSTIMESTAMP+1, 
     RECURRINGTRANSACTION.NOOFOCCURENSES  =r_currentTransRow(i).NOOFOCCURENSES-1 
     WHERE RECURRINGTRANSACTION.RECTRANSACTIONID=r_currentTransRow(i).RECTRANSACTIONID; 

     COMMIT; 
    END IF; 
    END LOOP; 
END; 
+0

: Merci beaucoup pour la réponse rapide et le code mis à jour. Je vais essayer de l'utiliser et vous faire savoir si je suis confronté à des problèmes. –

+0

J'ai utilisé le même code que celui que vous avez fourni et la procédure a été créée. mais il me donne les erreurs ci-dessous quand j'ai essayé d'exécuter avec '171' comme paramètre à la procédure: ORA-01843: mois pas valide ORA-06512: à "HR.RECURTRANSDAILY", ligne 35 ORA- 06512: à la ligne 1 01843. 00000 - "mois non valide" –

+0

ok laissez-moi le vérifier –