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

Oracle11g oracle 11:要将游标变量传递给过程中定义的变量吗,oracle11g,Oracle11g,以前我使用了一个临时表,它在过程外部创建,在SP中插入数据,并使用,,,但是如果我想在过程内部创建临时表,它会抛出一些错误..为了避免使用游标 CREATE OR REPLACE PROCEDURE P_EMAIL_update AS I NUMBER := 1; J NUMBER := 0; ID NUMBER; BEGIN INSERT INTO ENTITY_TEMP --(RN,

以前我使用了一个临时表,它在过程外部创建,在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;
创建或替换程序P\u电子邮件\u更新
作为
I编号:=1;
J数:=0;
身份证号码;
开始
插入实体_临时--(RN,实体_ID)
选择ROWNUM,e.id
来自实体e,公司c
其中e.companyid=c.id,e.status=3;
从实体_TEMP中选择j中的最大值(rn);

而你问题中的程序可以更简单地改写为:

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中引用子查询作为select


不过,我想问一下,为什么在actions表和entity表和company表的子查询之间没有任何联接条件。

请发布一些示例数据和所需结果,清楚地解释您需要做什么。实际上,我很难理解您的代码应该做什么。例如,如果要从表中获取最大值,为什么需要光标?如果您的过程没有参数,为什么要问如何传递游标?,…以前我使用了一个临时表,它在过程外部创建,并在SP中插入数据,然后使用,,,但是如果我想在过程内部创建临时表,它会抛出一些错误..为了避免尝试使用游标..再次,请发布一些示例数据和所需结果,清楚地解释您需要做什么,就像您只需要一个来自emp e的
select count(*)语句一样。
sql语句?或者,如果您需要光标中的所有行,则使用
count(*)over()
分析函数返回所有行的计数?根据您更新的问题,现在看起来您需要一条insert语句。我有几个问题:1。“从动作中选择”和“实体临时表”之间没有链接-您真的想从动作表中插入相同的行集x次,其中x是“实体临时表”中的行数吗?2.为什么要使用while循环而不是更标准的游标for循环?这样,您就不需要查找计数,也不需要从表中重新选择来查找id。
var\u id
是actions表的一列吗?如果不是,就不申报。