简体   繁体   English

在Oracle中的过程中使用%ROWTYPE

[英]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 : 我试图在代码中使用%ROWTYPE ,并尝试使用游标的循环将值插入其中,如下所示:

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. 我的要求是创建虚拟表,然后使用cursor for loop将数据插入到虚拟表中,否则不建议使用其他任何方法。

Please help it will be greatly appreciated! 请帮助,将不胜感激!

看起来表名称在您的INSERT语句中不正确。

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. 然后,使用“ BULK COLLECT INTO而不是如图所示插入。 Define your collection as table of cursor%ROWTYPE . 将您的集合定义为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;

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) 如果您需要处理数据(访问每一行-请参见下面的脚本,这是对嵌套表(PL / SQL集合)的顺序访问(插入)

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;

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! 谢谢大家的意见!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM