Точная выборка возвращает больше, чем запрошенное количество строк - Переписать код - PullRequest
0 голосов
/ 25 марта 2019

У меня есть следующий код:

WHILE (v_Count > 0) 
LOOP

Select  v_Columns || CHR(10) ||  CHR(9)  || ColumnName || ',' ,
    v_Values || CHR(10) ||  CHR(9)  ||
    CASE ISNUMERIC(Val) 
        WHEN 1 THEN Val 
        WHEN 0 THEN '''' || REPLACE(LTRIM(RTRIM(Val)), '''','''''') || '''' 
    END
    || ',' into v_Columns,v_Values
FROM 

(           
SELECT D.TableName, D.ColumnName, D.Val
FROM            
(         
    SELECT ID, TableName, ColumnName, Val  
    FROM tblTemplates_Load_OtherObjects_Raw OO  
    JOIN tblTemplates_Fields F ON OO.OtherObjectsField = F.FieldName 
    WHERE TemplateType IN ('All', v_TemplateType) 
    AND OO.Val IS NOT NULL 
    AND  (TemplateVersion = p_TemplateVersion or (TemplateVersion is null 
and p_TemplateVersion <> 'V8')) 

    UNION 

    SELECT FieldID, TableName, ColumnName, Val 
    FROM tblTemplates_Fields_OtherDestinations OD 
    JOIN  
    ( 
        SELECT ID, Val 
        FROM tblTemplates_Load_OtherObjects_Raw OO  
        JOIN tblTemplates_Fields F ON OO.OtherObjectsField = F.FieldName 
        WHERE TemplateType IN ('All', v_TemplateType) 
        AND OO.Val IS NOT NULL 
        AND    (TemplateVersion = p_TemplateVersion or (TemplateVersion is 
null and p_TemplateVersion <> 'V8')) 

    ) UsedIDs 
    ON OD.FieldID = UsedIDs.ID


) D


JOIN USER_TAB_COLS C  ON upper(D.TableName) = upper(C.TABLE_NAME) AND 
upper(D.ColumnName) = upper(C.COLUMN_NAME)
WHERE (v_UpdateComp = 0 OR D.TableName <> 'tblComp') 
AND (v_UpdateCompInd = 0 OR D.TableName <> 'tblCompInd') 
ORDER BY D.TableName, D.ColumnName
)

WHERE TableName = v_TableName ;

 v_Count := v_Count -1; 
end loop;

, где v_count - число и может принимать значения от 5 до 6.

Проблема здесь в том, что из-за циклическогоболее одного значения пытается быть сохранено в v_Columns и v_Values ​​и получение точной выборки возвращает больше, чем запрошенное количество строк ошибка.Я не могу понять, как переписать этот кусок кода, чтобы он работал нормально.

Как я могу переписать этот код?

1 Ответ

0 голосов
/ 25 марта 2019

Для меня самая подозрительная вещь - это UNION, которая - если оба SELECT s возвращают хотя бы строку - выдает две строки.Вы не можете поместить две строки в эти переменные и получили ошибку.

Что делать?Если возможно, перепишите его в цикл курсора FOR, который будет возвращать строку за строкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...