N.KH
N.KH

Reputation: 1

Using %ROWTYPE in Procedure in Oracle

I am trying to use %ROWTYPE in my code and trying to insert value into it using a cursor for loop as below :

CREATE or REPLACE PROCEDURE test_acr (
                  PROJECT_START_DATE IN DATE,USER_ID IN VARCHAR2) 
IS TYPE acr_new IS TABLE OF acr_projected_new%ROWTYPE 
        INDEX BY SIMPLE_INTEGER;  
acr_projected_neww acr_new;

CURSOR WEEKENDING_DATE IS  
      SELECT WEEKEND_DATE   
      FROM weekending_table 
      WHERE WEEKEND_DATE BETWEEN PROJECT_START_DATE AND sysdate;

BEGIN

FOR WEEKEND_DATE_REC in WEEKENDING_DATE LOOP 
INSERT INTO acr_projected_neww(WEEKEND_DATE,USERID,TIMESTAMP,ACR_PROJECTED,artificial_id)
       SELECT WEEKEND_DATE_REC.WEEKEND_DATE,USER_ID,sysdate,
                  (select sum(acr_h.activity_impact) 
       FROM ACR_HISTORY acr_h
       LEFT JOIN Activity act on act.activity_id = acr_h.activity_id
       LEFT JOIN Activity_Date_Duration act_d on act_d.activity_id = act.activity_id),1 from dual;

 END LOOP;
END test_acr;

When i try to run this i get below error:

Error(54,14): PL/SQL: ORA-00942: table or view does not exist

My Requirement is to create virtual table and insert the data into it using cursor for loop if not then any other means is appreciated.

Please help it will be greatly appreciated!

Upvotes: 0

Views: 5182

Answers (4)

N.KH
N.KH

Reputation: 1

I have used temporary table outside my procedure:

  CREATE GLOBAL TEMPORARY TABLE "MY_TEMP" 
   (    "WEEKEND_DATE" DATE, 
    "USERID" VARCHAR2(255 BYTE), 
    "TIMESTAMP" TIMESTAMP (6), 
    "ACR_PROJECTED" NUMBER, 
    "ARTIFICIAL_ID" NUMBER
   ) ON COMMIT PRESERVE ROWS ;

i have just used the above temporary table inside my Procedure

create or replace PROCEDURE GET_ACR_TEST(
  PROJECT_START_DATE IN DATE ,
  USER_ID IN VARCHAR2,

)  AS 
CURSOR WEEKENDING_DATE IS
  SELECT WEEKEND_DATE, DURATION 
  FROM weekending_table where WEEKEND_DATE between PROJECT_START_DATE and sysdate;

Begin

FOR WEEKEND_DATE_REC in WEEKENDING_DATE 
    LOOP
    insert into  MY_TEMP (WEEKEND_DATE,USERID,TIMESTAMP,ACR_PROJECTED,artificial_id)
      select WEEKEND_DATE_REC.WEEKEND_DATE,USER_ID,sysdate,
                       (select sum(acr_h.activity_impact) 
                       from ACR_HISTORY acr_h
                       LEFT JOIN Activity act on act.activity_id = acr_h.activity_id
                       LEFT JOIN Activity_Date_Duration act_d on act_d.activity_id = act.activity_id),1
     from dual;         
    End Loop;
END GET_ACR_TEST;

The above method is working.

Thank you all for your comments!

Upvotes: 0

fg78nc
fg78nc

Reputation: 5232

If you need to manipulate your data (access each row - then see script below, this is sequential access (inserts) into nested table (PL/SQL collection)

CREATE or REPLACE PROCEDURE test_acr (PROJECT_START_DATE IN DATE,USER_ID IN VARCHAR2) 
 IS  
 TYPE acr_new 
 IS TABLE OF acr_projected_new%ROWTYPE; // nested table, notice absence of INDEX by clause
    acr_projected_neww acr_new :=  acr_projected_neww(); // instantiation, constructor call

CURSOR WEEKENDING_DATE IS  
      SELECT WEEKEND_DATE   
      FROM weekending_table 
      WHERE WEEKEND_DATE BETWEEN PROJECT_START_DATE AND sysdate;

BEGIN

FOR WEEKEND_DATE_REC in WEEKENDING_DATE 
   LOOP
    acr_new.extend;  // make room for the next element in collection
    acr_new(acr_new.last) := WEEKEND_DATE_REC; // Adding seq. to the end of collection 
    ... 

 END LOOP;
END test_acr;

However if you want to BULK INSERT (there is no requirement to get access to each row) see script below

 CREATE or REPLACE PROCEDURE test_acr (PROJECT_START_DATE IN DATE,USER_ID IN VARCHAR2) 
  IS  
  TYPE acr_new IS TABLE OF acr_projected_new%ROWTYPE; // no INDEX BY clause
  acr_projected_neww acr_new = acr_new(); // Notice constructor call

CURSOR WEEKENDING_DATE IS  
      SELECT WEEKEND_DATE   
      FROM weekending_table 
      WHERE WEEKEND_DATE BETWEEN PROJECT_START_DATE AND sysdate;     

    BEGIN

    FETCH WEEKENDING_DATE BULK COLLECT INTO acr_projected_neww;  
    ...

     END LOOP;
    END test_acr;

Upvotes: 0

Kaushik Nayak
Kaushik Nayak

Reputation: 31666

You need not use two queries. Instead, define your cursor such that it has all the columns of the records you want to store in the collection. Then use BULK COLLECT INTO instead of insert as shown. Define your collection as table of cursor%ROWTYPE.

CREATE OR REPLACE PROCEDURE test_acr
IS
  CURSOR WEEKENDING_DATE
  IS
    SELECT a.col1,a.col2,b.col1,b.col2 ,c.col1
    from table1 a , table2 b LEFT JOIN table3 c;       --Here include all the data from the required tables.

TYPE acr_new
IS
  TABLE OF WEEKENDING_DATE%ROWTYPE;
  acr_projected_neww acr_new;
BEGIN
    FETCH WEEKENDING_DATE BULK COLLECT INTO acr_projected_neww;
END test_acr;

Upvotes: 0

Himanshujaggi
Himanshujaggi

Reputation: 391

Looks like table name is incorrect in your INSERT statement.

Upvotes: 1

Related Questions