希望有人可以帮助我。
所以假设我有一个名为“TEMP_TABLE”的临时表
EMP_ID number
EMP_FNAME varchar2()
EMP_LNAME varchar2()
“TEMP_TABLE”中的记录
1, Some, Guy
2, Some, Girl
3, Some, Animal
通过一些SQL魔术,我不打算深入研究,计算这些值并将其放入TEMP_TABLE,即函数返回的select * from TEMP_TABLE
的多重集
假设函数是FUNC_THAT_RETURNS_TABLE
好的,如果我说Select * from table("FUNC_THAT_RETURNS_TABLE");
我回来了:
1, Some, Guy
2, Some, Girl
3, Some, Animal
到目前为止一切顺利。
现在我创建另一个名为"NEWLY_CREATED_TABLE"
说:
Create Table "NEWLY_CREATED_TABLE" AS
(Select * FROM table("FUNC_THAT_RETURNS_TABLE"));
请注意,该表是通过查询函数
创建的所以这三条记录现在应该在NEWLY_CREATED_TABLE
之内问题在于此 如果我说:
Select * FROM NEWLY_CREATED_TABLE
Union
SELECT * FROM table("FUNC_THAT_RETURNS_TABLE");
结果集是:
1, Some, Guy
1, Some, Guy
2, Some, Girl
2, Some, Girl
3, Some, Animal
3, Some, Animal
即使数据完全相同,有人可以告诉我我缺少的东西吗?
在测试使用合并的可能性时,我发现了联合问题。 当我尝试将表中的数据与函数中的数据合并时,表中的所有数据都将被替换。这让我认为代码没有正确识别唯一记录。
我的合并代码:
Merge Into Newly_Created_Table a
using
(
Select * from table(Func_That_Returns_TABLE)
) b
On (a.EMP_ID = b.EMP_ID)
When Matched....
When Not Matched....
**编辑** 9-7-2016 SHOUTOUT TO @Shannon Severance其中一个列中有一个空白区域。
除了在插入之前尝试修剪插入,截断或使用触发器以修剪:NEW值之外,是否有任何方法,以确保不会在没有明显原因的情况下添加尾随空格?
答案 0 :(得分:1)
我为您找到了解决方案。我运行了它,没有得到任何错误。
CREATE TABLE temp_table
(
EMP_ID NUMBER,
EMP_FNAME varchar2(32),
EMP_LNAME varchar2(32)
);
INSERT INTO temp_table values (1, 'SOME','Guy');
INSERT INTO temp_table values (2, 'SOME','Girl');
INSERT INTO temp_table values (3, 'SOME','Animal');
CREATE OR REPLACE TYPE three_values_ot AS OBJECT
(
EMP_ID NUMBER,
EMP_FNAME varchar2(32),
EMP_LNAME varchar2(32)
);
CREATE OR REPLACE TYPE three_values_nt
IS TABLE OF three_values_ot;
CREATE OR REPLACE FUNCTION FUNC_THAT_RETURNS_TABLE
RETURN three_values_nt
IS
l_return three_values_nt :=
three_values_nt (three_values_ot (1, 'SOME','Guy'),
three_values_ot (2, 'SOME','Girl'),
three_values_ot (3, 'SOME','Animal'));
BEGIN
RETURN l_return;
END;
SELECT * FROM temp_table
UNION
SELECT * FROM TABLE (FUNC_THAT_RETURNS_TABLE ());
上述联合查询的输出为
1 SOME Guy
2 SOME Girl
3 SOME Animal