PL/SQL-循环插入和选择

PL/SQL-循环插入和选择,sql,oracle,loops,plsql,insert,Sql,Oracle,Loops,Plsql,Insert,我想要一个可重用的脚本,它可以通过交换变量值进行配置。我希望能够循环一组标记ID,并为每个标记插入一行。我还想在提交之前检查插入的任一侧,以进行视觉验证 这就是我迄今为止所尝试的: set verify off; set serveroutput on; define uname = 'foobar' define f_name = 'foo' define l_name = 'bar' declare type numListType is table of number; numLi

我想要一个可重用的脚本,它可以通过交换变量值进行配置。我希望能够循环一组
标记ID
,并为每个标记插入一行。我还想在提交之前检查插入的任一侧,以进行视觉验证

这就是我迄今为止所尝试的:

set verify off;
set serveroutput on;

define uname = 'foobar'
define f_name = 'foo'
define l_name = 'bar'

declare
 type numListType is table of number;
 numList numListType;

begin
numList := numListType(432,433,434,435);

for i in numList.FIRST..numList.LAST loop
    dbms_output.put_line('EXPECTING 0');
    select count(*)
    from security_tag_tbl
    where tag_id = numList(i);

    dbms_output.put_line('INSERTING ROW');
    insert into security_tag_tbl (id, username, first_name, last_name, tag_id)
    values (security_tag_tbl_seq.nextval, '&uname', '&f_name', '&l_name', numList(i));

    dbms_output.put_line('EXPECTING 1');
    select count(*)
    from security_tag_tbl
    where tag_id = numList(i);
end loop;
end;
/

set serveroutput off;
set verify on;
此示例的问题:

  • 此示例返回select查询周围的错误
  • 当我删除select语句时,示例代码返回带有“numList”索引的错误

关于处理此场景的正确方法有什么建议吗?

好的,首先,上面的代码包含一些问题。在PL/SQL中使用SELECT时,必须将其存储在带有INTO关键字的变量中

为了重现您的问题,我使用以下脚本创建了表和序列:

create table security_tag_tbl (id number, username varchar2(200), first_name varchar2(200), last_name varchar2(200), tag_id number);

create sequence security_tag_tbl_seq;
然后,我将您的代码修改为:

set verify off;
set serveroutput on;

define uname = 'foobar'
define f_name = 'foo'
define l_name = 'bar'

declare
 type numListType is table of number;
 numList numListType;

 firstcount number;
 secondcount number;

begin
numList := numListType(432,433,434,435);

for i in numList.FIRST..numList.LAST loop
    dbms_output.put_line('EXPECTING 0');
    select count(*)
    into firstcount
    from security_tag_tbl
    where tag_id = numList(i);

    dbms_output.put_line('GOT ' || firstcount);


    dbms_output.put_line('INSERTING ROW');
    insert into security_tag_tbl (id, username, first_name, last_name, tag_id)
    values (security_tag_tbl_seq.nextval, '&uname', '&f_name', '&l_name', numList(i));

    dbms_output.put_line('EXPECTING 1');
    select count(*)
    into secondcount
    from security_tag_tbl
    where tag_id = numList(i);

    dbms_output.put_line('GOT ' || secondcount);

end loop;
end;
/

set serveroutput off;
set verify on;
现在,您将获得有关正在发生的事情的视觉反馈。下一个问题是,当你没有得到想要的结果时该怎么办?您可以进行如下构造,根据这些计数的结果提交或回滚事务:

set verify off;
set serveroutput on;

define uname = 'foobar'
define f_name = 'foo'
define l_name = 'bar'

declare
 type numListType is table of number;
 numList numListType;

 firstcount number;
 secondcount number;
 errorocured boolean := false;

begin
numList := numListType(432,433,434,435);

for i in numList.FIRST..numList.LAST loop
    dbms_output.put_line('EXPECTING 0');
    select count(*)
    into firstcount
    from security_tag_tbl
    where tag_id = numList(i);

    dbms_output.put_line('GOT ' || firstcount);
    if (firstcount != 0) then
      errorocured := true;
    end if;


    dbms_output.put_line('INSERTING ROW');
    insert into security_tag_tbl (id, username, first_name, last_name, tag_id)
    values (security_tag_tbl_seq.nextval, '&uname', '&f_name', '&l_name', numList(i));

    dbms_output.put_line('EXPECTING 1');
    select count(*)
    into secondcount
    from security_tag_tbl
    where tag_id = numList(i);

    dbms_output.put_line('GOT ' || secondcount);

    if (secondcount != 1) then
      errorocured := true;
    end if;


end loop;


if errorocured = true  then
  dbms_output.put_line('Something wend wrong, rolling back batch');
  rollback;
else
  dbms_output.put_line('Everything ok, committing batch');
  commit;
end if;

end;
/

set serveroutput off;
set verify on;

如果要将此代码用于更大的数字或记录,可能还需要研究批量操作。关于它的好文档可以在这里找到:

上面的代码有什么问题吗?很抱歉,很好,我现在已经添加了详细信息。谢谢@BobJarvis