Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql DBMS_输出中的批量收集到数组和错误处理_Sql_Database_Oracle_Plsql_Oracle12c - Fatal编程技术网

Sql DBMS_输出中的批量收集到数组和错误处理

Sql DBMS_输出中的批量收集到数组和错误处理,sql,database,oracle,plsql,oracle12c,Sql,Database,Oracle,Plsql,Oracle12c,我将数据从表A复制到表B。在表A中,我有四列国家(欧洲、欧洲、俄罗斯、英国)。每个国家/地区的列在表B中是一个单独的行。此外,表B中的每一行必须重复并接收下一个序列号 DBMS_OUTPUT.PUT_LINE(tab(x)."company" || ' ' || tab(x)."UK" || SQLERRM); 表A-我的光标 +---------+---------+---------+---------+---------+ | Company | EN | ES |

我将数据从表A复制到表B。在表A中,我有四列国家(欧洲、欧洲、俄罗斯、英国)。每个国家/地区的列在表B中是一个单独的行。此外,表B中的每一行必须重复并接收下一个序列号

DBMS_OUTPUT.PUT_LINE(tab(x)."company" || ' ' || tab(x)."UK" || SQLERRM);
表A-我的光标

+---------+---------+---------+---------+---------+
| Company |   EN    |   ES    |   RU    |   UK    |
+---------+---------+---------+---------+---------+
| Intel   | 123 345 | 453 343 | 444 101 | 110 232 |
+---------+---------+---------+---------+---------+
DBMS_OUTPUT.PUT_LINE(tab(x)."company" || ' ' || tab(x)."UK" || SQLERRM);
表B

+---------+---------+-----+
| Company | Country | SEQ |
+---------+---------+-----+
| Intel   | 123 345 |   0 |
| Intel   | 123 345 |   1 |
| Intel   | 453 343 |   0 |
| Intel   | 453 343 |   1 |
| INTEL   | 444 101 |   0 |
| INTEL   | 444 101 |   1 |
| INTEL   | 110 232 |   0 |
| INTEL   | 110 232 |   1 |
+---------+---------+-----+
DBMS_OUTPUT.PUT_LINE(tab(x)."company" || ' ' || tab(x)."UK" || SQLERRM);
在表A中,我有1000000行。
在表B中,我应该有1000000(行)x4(国家)x2(序列)=8000000

DBMS_OUTPUT.PUT_LINE(tab(x)."company" || ' ' || tab(x)."UK" || SQLERRM);
我准备了插入数据的程序

BEGIN

OPEN my_cursor;
    LOOP
        EXIT WHEN my_cursor%notfound;
        FETCH my_cursor BULK COLLECT INTO TAB LIMIT 500;

        FOR y in 0..1 LOOP 

                FORALL x IN TAB.first..TAB.last 
                    INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."EN", y);

                FORALL x IN TAB.first..TAB.last
                    INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."ES", y);

                FORALL x IN TAB.first..TAB.last 
                    INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."RU", y);

                FORALL x IN TAB.first..TAB.last 
                    INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."UK", y);

        END LOOP;

        COMMIT;
    END LOOP;     
CLOSE my_cursor;

END;
DBMS_OUTPUT.PUT_LINE(tab(x)."company" || ' ' || tab(x)."UK" || SQLERRM);
在表B中出现DML错误的情况下,我必须返回数组(tab)中变量的值以及DBMS_输出中的错误代码 例如:

DBMS_OUTPUT.PUT_LINE(tab(x)."company" || ' ' || tab(x)."UK" || SQLERRM);
有可能处理这样的错误吗?我如何实现这样的解决方案?
.

您可以通过对所有人使用
来实现您的目标。。。保存异常
说明。
DBMS_OUTPUT.PUT_LINE(tab(x)."company" || ' ' || tab(x)."UK" || SQLERRM);
这将为您提供以下信息:

DBMS_OUTPUT.PUT_LINE(tab(x)."company" || ' ' || tab(x)."UK" || SQLERRM);
DECLARE
    ln_error_count NUMBER;
    ln_line_error  NUMBER;
BEGIN

    OPEN my_cursor;
    LOOP
        EXIT WHEN my_cursor%notfound;
        FETCH my_cursor BULK COLLECT INTO TAB LIMIT 500;

        FOR y in 0..1 LOOP

            BEGIN
                FORALL x IN TAB.first..TAB.last SAVE EXCEPTIONS
                    INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."EN", y);
            EXCEPTION
                WHEN ex_dml_errors THEN
                    ln_error_count := SQL%BULK_EXCEPTIONS.count;
                    FOR i IN 1 .. ln_error_count LOOP
                        ln_line_error := SQL%BULK_EXCEPTIONS(i).error_index;
                        DBMS_OUTPUT.PUT_LINE(tab(ln_line_error)."company" || ' ' || tab(ln_line_error)."EN" || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
                    END LOOP;
            END;

            BEGIN
                FORALL x IN TAB.first..TAB.last SAVE EXCEPTIONS
                    INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."ES", y);
            EXCEPTION
                WHEN ex_dml_errors THEN
                    ln_error_count := SQL%BULK_EXCEPTIONS.count;
                    FOR i IN 1 .. ln_error_count LOOP
                        ln_line_error := SQL%BULK_EXCEPTIONS(i).error_index;
                        DBMS_OUTPUT.PUT_LINE(tab(ln_line_error)."company" || ' ' || tab(ln_line_error)."ES" || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
                    END LOOP;
                END;

            BEGIN
                FORALL x IN TAB.first..TAB.last SAVE EXCEPTIONS
                    INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."RU", y);
            EXCEPTION
                WHEN ex_dml_errors THEN
                    ln_error_count := SQL%BULK_EXCEPTIONS.count;
                    FOR i IN 1 .. ln_error_count LOOP
                        ln_line_error := SQL%BULK_EXCEPTIONS(i).error_index;
                        DBMS_OUTPUT.PUT_LINE(tab(ln_line_error)."company" || ' ' || tab(ln_line_error)."RU" || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
                    END LOOP;
            END;

            BEGIN
                FORALL x IN TAB.first..TAB.last SAVE EXCEPTIONS
                    INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."UK", y);
            EXCEPTION
                WHEN ex_dml_errors THEN
                    ln_error_count := SQL%BULK_EXCEPTIONS.count;
                    FOR i IN 1 .. ln_error_count LOOP
                        ln_line_error := SQL%BULK_EXCEPTIONS(i).error_index;
                        DBMS_OUTPUT.PUT_LINE(tab(ln_line_error)."company" || ' ' || tab(ln_line_error)."UK" || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
                    END LOOP;
            END;
        END LOOP;

        COMMIT;
    END LOOP;     
    CLOSE my_cursor;

END;

是的,您可以使用
SAVE EXCEPTIONS
FORALL
处理此类错误并继续执行所有插入操作,如下所示: 执行完所有语句后,PLSQL将引发
ORA:24381

DBMS_OUTPUT.PUT_LINE(tab(x)."company" || ' ' || tab(x)."UK" || SQLERRM);
BEGIN
FORALL x IN TAB.first..TAB.last SAVE EXCEPTIONS
                    INSERT INTO table_B ("company","country","seq") VALUES (tab(x)."company", tab(x)."EN", y);
EXCEPTION 
WHEN OTHERS THEN
 IF sqlcode = -24381
     FOR indx IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
         LOOP
            DBMS_OUTPUT.put_line (
                  SQL%BULK_EXCEPTIONS (indx).ERROR_INDEX
               || ‘: ‘
               || SQL%BULK_EXCEPTIONS (indx).ERROR_CODE);
         END LOOP;
else 
raise;
end if;
END;

虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-谢谢@max23_uu的评论。我已经相应地更新了我的帖子。