【发布时间】:2015-05-31 15:43:28
【问题描述】:
我想确认以下内容的正确使用:
1) 使用全局变量仅从函数中获取一次返回值 (因为我的函数将返回一些序列值)
2) 在游标内多次使用该变量
3) 所有这些都将在一个过程中
下面是一个示例。
CREATE OR REPLACE Procedure insert_myTable is
--declare variables for insert
v_firstNO VARCHAR2(10);
v_secondNO VARCHAR2(6);
--declare variable to store the sequence number
var_ASeqno varchar2(6);
-- Validation
v_check VARCHAR2 (10 Byte);
v_table_name varchar2(50):='myTable';
cursor c1 is
select distinct firstNO,
secondNO
from (SELECT hdr.someNum firstNO,
-- using variable to assign the sequence no
var_ASeqno secondNO
FROM someOtherTable hdr
WHERE -- some condition
union
SELECT hdr.someNum firstNO,
-- using variable to assign the sequence no
var_ASeqno secondNO
FROM someOtherTable hdr
WHERE -- some other conditions
union
SELECT hdr.someNum firstNO,
-- using variable to assign the sequence no
var_ASeqno secondNO
FROM someOtherTable hdr
WHERE -- some other other conditions
begin
if c1%isopen then
close c1;
end if;
v_check:=null;
FOR i IN c1 LOOP
--assign variables for insert
v_firstNO := i.firstNO ;
v_secondNO := i.secondNO ;
begin
-- calling the Function aSeqNoFunc and assign the
--Sequence Number into the variable var_ASeqno
var_ASeqno := aSeqNoFunc();
select firstNO
into v_check
from myTable a
where firstNO = i.firstNO
and secondNO =i.secondNO;
exception
when no_data_found then
--insert into target table
INSERT INTO myTable (firstNO, secondNO)
values (v_firstNO, v_secondNO);
end ;
end loop;
end;
可以看出,函数“aSeqNoFunc”在接近末尾的插入之前被调用。这些值被分配给变量“var_ApmSeqno”,该变量又在游标内使用了 3 次。
谢谢。
【问题讨论】:
-
这似乎是一种非常低效的决定是否插入表格的方法。此外,您在打开游标后为 var_ASeqno 分配了一个值,因此游标中的值将为空。然后,一旦你分配了它,你就不会对它做任何事情。您要解决的实际问题是什么?我的直觉是,这可以在单个 SQL 语句中完成(可能是
MERGE)。还有,aSeqNoFunc()是做什么的? -
是的,其实这就是问题所在。一旦我将值分配给变量,我应该在光标内使用它。函数 aSeqNoFunc 只返回序列的下一个值
-
那么所有被插入的行都应该有相同的序列号?
-
另外,光标中的表(“someOtherTable”)都是同一个表吗?如果是这样,为什么不将 where 子句组合成一个单独的选择,而不是将它们联合在一起。此外,如果您要使用联合,则不需要在外部查询中使用 distinct,因为联合会自动删除重复项。
-
是的,行应该有相同的序列号。不,表格不同。我同意,不同的并不重要,可以删除。
标签: sql oracle stored-procedures plsql cursor