【发布时间】:2015-11-12 15:46:22
【问题描述】:
我正在尝试从 select 语句中插入 2 个变量值,但我收到一条错误消息:
精确提取返回的行数超过请求的行数
我猜我需要将选择查询中的数据放入某种表类型中? 但我需要处理单个记录,以便将变量 v_zmienna 与 v_zmienna2 进行比较。
如您所见,我尝试以某种方式将数据传输到 v_zmienna 和 v_zmienna2,然后比较这些值。
有人可以看看并提出最好的方法吗?
我需要使用执行立即数和变量,因为我有 Table1、Table2 表作为配置表以及应连接的表名等。
declare
c1 SYS_REFCURSOR;
v_sourcepkcolumn varchar2(50);
v_sourcetable varchar2(50);
v_targetfkcolumn varchar2(50);
v_targetpkcolumn varchar2(50);
v_targettable varchar2(50);
v_sourcecolumn varchar2(50);
v_targetcolumn varchar2(50);
v_verificationdefid varchar2(50);
v_zmienna varchar2(50);
v_zmienna2 varchar2(50);
v_random_number number;
begin
v_random_number := sequence1.nextval;
open c1 for select sourcepkcolumn,
sourcetable,
targetfkcolumn,
targetpkcolumn,
targettable,
sourcecolumn,
targetcolumn,
ID
from table1,table2 where table1.ID=table2.ID;
loop
fetch c1 into v_sourcepkcolumn,
v_sourcetable,
v_targetfkcolumn,
v_targetpkcolumn,
v_targettable,
v_sourcecolumn,
v_targetcolumn,
v_verificationdefid;
exit when c1%notfound;
execute immediate 'select '||v_sourcetable||'.'||v_sourcecolumn||','||v_targettable||'.'||v_targetcolumn||' from '||v_sourcetable||','||v_targettable||' where '||
v_sourcetable||'.'||v_sourcepkcolumn||'='||v_targettable||'.'||v_targetfkcolumn into v_zmienna,v_zmienna2;
if (v_zmienna=v_zmienna2) then
execute immediate 'insert into table3 values ('||v_random_number||','||v_sourcecolumn||','||v_sourcepkcolumn||','||v_zmienna||',1,'||v_targetcolumn||','||v_targetpkcolumn||','||v_zmienna2||',timestamp,'||v_verificationdefid||')';
else
execute immediate 'insert into table3 values ('||v_random_number||','||v_sourcepkcolumn||','||v_zmienna||',0,'||v_targetcolumn||','||v_targetpkcolumn||','||v_zmienna2||',timestamp,'||v_verificationdefid||')';
end if;
end loop;
close c1;
end;
编辑:
输出
select sourcepkcolumn,
sourcetable,
targetfkcolumn,
targetpkcolumn,
targettable,
sourcecolumn,
targetcolumn,
from table1,table2 where table1.id=table2.id
看起来:
PK_ACCOUNT,ACCOUNT,PK_ACC,ID,ACCOUNT2,NAME,NAME
这是table1和table2的输出,
重要提示:帐户和帐户2 是视图!那不是 TABLES。
所以现在我不想将 account VIEW 中的 account.name 和 account2.name 与 account.pk_account=account2.pk_acc 上的 account2 VIEW 进行比较。 通常它工作得很好,但有时(取决于 oracle 顺序)在加入后 VIEW 中的记录可以是其他顺序。 例如: 帐号:
PK_ACCOUNT NAME
1 Eva
1 Adam
和 帐号2
PK_ACCOUNT NAME
1 Adam
1 Eva
为什么在 VIEW 中查看不同的 PK_ACCOUNT?因为我需要从多个表中插入 Account 和 Account2 数据。这就是为什么记录有时会成倍增加。
当程序对每条记录逐一处理时,将其视为发散
【问题讨论】:
-
在您的
insert into table3语句中,您引用了“时间戳”。您指的是 “systimestamp” 吗?此外,您的第二个插入语句只插入 9 个值,但您的第一个插入是插入 10 个。table3 中有多少列?