我编写了一个存储过程,从一个表中选择(某些列具有空数据)并插入到没有重复的其他表中。
我的存储过程代码的一部分:
LOOP
BEGIN
SELECT ID
INTO ROWCOUNT
FROM TBL_EMPLOYEE
WHERE
NAME = TEMPTABLE.NAME
AND AGE =TEMPTABLE.AGE
EXCEPTION
WHEN no_data_found THEN
ROWCOUNT := 0;
END;
IF ROWCOUNT = 0 THEN
INSERT INTO TARGET TABLE ......
在上面的代码中,某些列有空数据(例如:TEMPTABLE.AGE等)。 当有空值时,它会抛出no_data_found异常并插入数据。我们通过放置nvl函数来尝试,这需要花费更多时间。
LOOP
BEGIN
SELECT ID
INTO ROWCOUNT
FROM TBL_EMPLOYEE
WHERE
nvl(NAME,0000) = nvl(TEMPTABLE.NAME,0000)
AND nvl(AGE,0000) =nvl(TEMPTABLE.AGE,0000)
EXCEPTION
WHEN no_data_found THEN
ROWCOUNT := 0;
END;
IF ROWCOUNT = 0 THEN
INSERT INTO TARGET TABLE ......
任何人都可以建议任何替代方法如何使用等于运算符进行空检查。 我也尝试过LIKE,但它没有用。
答案 0 :(得分:1)
你正在以错误的方式进行检查。完全消除ROWCOUNT
变量和循环并使用NOT EXISTS()
:
BEGIN
INSERT INTO TARGET_TABLE
SELECT .....
FROM DUAL
WHERE NOT EXISTS (
SELECT *
FROM TBL_EMPLOYEE
WHERE nvl(NAME,0000) = nvl(TEMPTABLE.NAME,0000)
AND nvl(AGE,0000) = nvl(TEMPTABLE.AGE,0000);
END
您的情况可能有错误:如果您打算将两个空值视为“相等”,请将条件更改为:
WHERE (NAME = TEMPTABLE.NAME OR NVL(NAME, TEMPTABLE.NAME) IS NULL)
AND (AGE = TEMPTABLE.AGE OR NVL(AGE, TEMPTABLE.AGE) IS NULL)
答案 1 :(得分:0)
替换
nvl(NAME,0000) = nvl(TEMPTABLE.NAME,0000)
带
(NAME is NULL and TEMPTABLE.NAME is null or NAME = TEMPTABLE.NAME)
答案 2 :(得分:0)
我想你想这样做:
NAME = VALUE {in case of Some Value}
和
NAME IS NULL {in case the value is null}
ORACLE不会自己处理它。我认为这是一个合乎逻辑的条件,这应该在逻辑上处理。如果我已正确回答/理解你,请告诉我?
答案 3 :(得分:0)
尝试用最简单的术语解释您想要完成的任务。你提出了一系列令人困惑的要求,并且投入了一些代码,这些代码无论如何都可能使我们错误地走上正轨。可能你需要的东西可以在一个语句中完成,没有循环。一些尝试:
通过某些键列[name,age]删除重复项,以另一列的值来区分。
INSERT INTO target (name,age,other_value1,other_value2)
SELECT
name, age,other_value1,other_value2
FROM (
SELECT
name,
age,
other_value1,
other_value2,
ROW_NUMBER() OVER (PARTITION BY name,age ORDER BY other_value1) rn
FROM source
) WHERE rn = 1
区分列可以是输入数据的时间戳,您可以使用ROW_NUMBER() OVER (PARTITION BY name,age ORDER BY time_entered DESC) rn
之类的内容保留最新记录。
根据所有列
删除重复项INSERT INTO target (name,age,other_value1,other_value2)
SELECT
name, age,other_value1,other_value2
FROM source
GROUP BY name,age,other_value1,other_value2
答案 4 :(得分:0)
BEGIN
SELECT ID
INTO ROWCOUNT
FROM TBL_EMPLOYEE
WHERE decode(NAME,TEMPTABLE.NAME,1)=1
AND decode(AGE,TEMPTABLE.AGE,1)=1
EXCEPTION
WHEN no_data_found THEN
ROWCOUNT := 0;
END;
它适用于任何简单的数据类型 - 数字varchar2,日期等。
答案 5 :(得分:0)
我的解决方案是:
SELECT Name,Age FROM TBL_EMPLOYEE WHERE NAME ='yourName'AND ((AGE = yourAge)OR(AGE为NULL且yourAge为NULL))
这里NAME和AGE是表列名。 'yourName'和'yourAge'是传递的运行时值。
如果它不适合你,请告诉我。