oracle 11:想要将游标变量传递给过程中定义的变量

时间:2017-06-07 08:06:29

标签: oracle11g

以前我使用了一个临时表,它在程序外创建并在SP中插入数据并使用,,,但是如果我想在程序中创建一个临时表,它会抛出一些错误...以避免尝试使用游标..

CREATE OR REPLACE PROCEDURE P_EMAIL_update
AS
   I    NUMBER := 1;
   J    NUMBER := 0;
   ID   NUMBER;
BEGIN
   INSERT INTO ENTITY_TEMP                                    --(RN,ENTITY_ID)
      SELECT ROWNUM, e.id
        FROM entity e, company c
       WHERE e.companyid = c.id AND e.status = 3;

   SELECT MAX (rn) INTO j FROM ENTITY_TEMP;

   WHILE i <= j
   LOOP
      SELECT entity_id
        INTO id
        FROM ENTITY_TEMP
       WHERE rn = i;

      INSERT INTO ACTIONS_EMAIL_MAPPING (ID,
                                         ISACTIVE,
                                         ACTIONNAME,
                                         EMAILFROM,
                                         EMAILSUBJECT,
                                         EMAILBODY
                                         )
         (SELECT SEQ_ENT.NEXTVAL,
                 'N',
                 ACTIONNAME,
                 EMAILFROM,
                 EMAILSUBJECT,
                 EMAILBODY || var_id
            FROM ACTIONS
           WHERE ISACTIVE = 'T' AND ACTIONNAME NOT IN ('sample'));

      I := I + 1;
   END LOOP;
   END;

1 个答案:

答案 0 :(得分:0)

您问题中的程序可以更简单地重写为:

CREATE OR REPLACE PROCEDURE p_email_update AS
BEGIN

  INSERT INTO actions_email_mapping (id, isactive, actionname, emailfrom, emailsubject, emailbody)
  SELECT seq_ent.nextval,
         'N',
         a.actionname,
         a.emailfrom,
         a.emailsubject,
         a.emailbody || ent.id -- assuming var_id is a column of actions
  FROM   actions a
         CROSS JOIN (SELECT e.id
                     FROM   entity e
                            inner join company c on e.companyid = c.id
                     WHERE  e.status = 3) ent -- maybe this should be an inner join with some join conditions?
  WHERE  a.isactive = 'T'
  AND    a.actionname NOT IN ('sample');

END p_email_update;
/

无需重新设计交叉连接(这是您的代码正在以非常迂回的方式进行的操作)。根据您在问题中告诉我们的内容,也无需将数据存储在临时表中,因为您可以直接在insert-as-select中引用子查询。

我会质疑为什么你的actions表与实体和公司表上的子查询之间没有任何连接条件。