Oracle11g oracle 11:要将游标变量传递给过程中定义的变量吗
以前我使用了一个临时表,它在过程外部创建,在SP中插入数据,并使用,,,但是如果我想在过程内部创建临时表,它会抛出一些错误..为了避免使用游标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,
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表的一列吗?如果不是,就不申报。